Wolfgang Grandegger wrote:
On 06/16/2011 05:20 PM, Andrew Tannenbaum wrote:
I was trying to use the Xenomai RT-Socket-CAN rtcanrecv in a Tcl/Tk
script GUI wrapper.
rtcanrecv uses printf to stdout, and it line-buffers when attached to a
tty, but it uses larger buffers (so it is unusable) when run from a
script with no tty.
Tcl does stdio with pipes rather than ptys (that is, Tcl thinks it has
no tty for stdio). I think both bash and perl use ptys (and so don't
have this problem). I haven't done a more thorough survey, but that's
not the point.
I think it would be nice to modify rtcanrecv so it can write stdout in
line-buffered mode. If you think this is a good idea, please either set
line buffering with
setvbuf(stdout, NULL, _IOLBF, 0);
at the top of src/utils/can/rtcanrecv.c:rt_task() or
fflush(stdout);
after the printf("\n") at the bottom of rt_task(), or you could add a
command line getopt option for line-buffering that would do one of the
above.
I would prefer the latter, patches are welcome. Be aware that using
printf will switch to secondary mode which should be avoided if
real-time is required.
Wolfgang.
Wolfgang,
rtcanrecv already exists using printf, I'm just changing the buffering.
I added a -L (line-buffer) getopt switch (default=off), as you
suggested. I added it to the C source and the man page.
Attached are two diff patch files, one for rtcanrecv.c and one for
rtcanrecv.man.in . I see there is a generated version of the html man
page in the tar file, I assume that is created automatically, so I
didn't patch it. I created the patches within the folders containing
the source files, and I diffed from filenames foo.orig to foo. I am not
aware of the naming protocol for patches in the development tree, but
these are simple patches so I hope they are sufficient.
-Andy
--- rtcanrecv.c.orig 2011-06-27 12:02:43.634343171 -0400
+++ rtcanrecv.c 2011-06-27 12:12:32.834332555 -0400
@@ -24,6 +24,7 @@
" -R, --timestamp-rel with relative timestamp\n"
" -v, --verbose be verbose\n"
" -p, --print=MODULO print every MODULO message\n"
+ " -L, --line-buffer use line buffering\n"
" -h, --help this help\n",
prg);
}
@@ -31,7 +32,7 @@
extern int optind, opterr, optopt;
-static int s = -1, verbose = 0, print = 1;
+static int s = -1, verbose = 0, print = 1, line_buffer = 0;
static nanosecs_rel_t timeout = 0, with_timestamp = 0, timestamp_rel = 0;
RT_TASK rt_task_desc;
@@ -174,6 +175,7 @@
{ "timeout", required_argument, 0, 't'},
{ "timestamp", no_argument, 0, 'T'},
{ "timestamp-rel", no_argument, 0, 'R'},
+ { "line-buffer", no_argument, 0, 'L'},
{ 0, 0, 0, 0},
};
@@ -182,7 +184,7 @@
signal(SIGTERM, cleanup_and_exit);
signal(SIGINT, cleanup_and_exit);
- while ((opt = getopt_long(argc, argv, "hve:f:t:p:RT",
+ while ((opt = getopt_long(argc, argv, "hve:f:t:p:RTL",
long_options, NULL)) != -1) {
switch (opt) {
case 'h':
@@ -230,6 +232,10 @@
with_timestamp = 1;
break;
+ case 'L':
+ line_buffer = 1;
+ break;
+
default:
fprintf(stderr, "Unknown option %c\n", opt);
break;
@@ -311,6 +317,10 @@
}
}
+ if (line_buffer) {
+ setvbuf(stdout, NULL, _IOLBF, 0);
+ }
+
snprintf(name, sizeof(name), "rtcanrecv-%d", getpid());
ret = rt_task_shadow(&rt_task_desc, name, 0, 0);
if (ret) {
--- rtcanrecv.man.in.orig 2011-06-27 13:19:28.558330768 -0400
+++ rtcanrecv.man.in 2011-06-27 13:20:27.798334902 -0400
@@ -46,6 +46,9 @@
.B \-p, \-\-print=MODULO
print every MODULO message
.TP
+.B \-L, \-\-line-buffer
+flush buffered ouput for each line
+.TP
.B \-h, \-\-help
this help
.SH "SEE ALSO"
_______________________________________________
Xenomai-help mailing list
Xenomai-help@gna.org
https://mail.gna.org/listinfo/xenomai-help