dbus-monitor and control-c (again)

Randell Jesup rjesup at wgate.com
Thu Sep 17 10:58:34 PDT 2009

Perhaps already fixed in CVS/git/etc: dbus-monitor and control-c

a) dbus-monitor doesn't actually respond to ^C.  It has a signal
   handler, but it doesn't work in a "quiet" system - you have to ^Z out
   and kill it.  The problem is that
   dbus_connection_read_write_dispatch() is used with -1 (blocking), so
   ^C will invoke the signal handler, but won't kick you out of the 
   blocking function call, and so it won't exit.

   Patch: change -1 to (say) 1000, and then it will wait no more than 1
   second before noticing the ^C.

b) (related): profile mode doesn't fflush() at the end of each message,
   so if you have to kill it the output gets lost, and if you're piped
   to a tee (for example), you won't see output for a while unless
   there's a lot of traffic.

   compare: "dbus-monitor --profile" to "dbus-monitor --profile | tee /tmp/foo"

   Patch: add fflush() at the bottom of print_message_profile()

   Note that adding it to the main loop right before exit() doesn't seem
   to help, because unless you use "-i" to tee, ^C will cause tee to
   exit before dbus-monitor gets a chance to flush.  This issue with tee
   may also be why someone was reporting losing output on ^C in the
   first place: --monitor mode uses fflush() already, so there's no need
   for a signal handler for it - data will never be buffered for more
   than one dbus message.

Overall suggestion: ditch the ^C handler and add fflush() to
print_message_profile().  Alternate: change timeout to 500 or 1000, and
add fflush() to print_message_profile().

Randell Jesup, Worldgate (developers of the Ojo videophone)
rjesup at wgate.com

More information about the dbus mailing list