SIGTERM and SIGINT handler to flush xentop -b outputs
PATCH 1/1 SIGTERM and SIGINT handler to flush xentop -b outputs
Flush stdout when xentop -b gets SIGINT and SIGTERM. It is useful when
you stop xentop -b by keyboard interrupt or by other programs such as killall from a batch script. You would have missed the bottom part of xentop outputs without this patch.
This second patch calls no unsafe function in a signal handler. The
main loop breaks and xentop exits normally when a flag is set by the signal handler. Stdout is flushed accordingly.
Signed-off-by INAKOSHI Hiroya <[email protected]>
tools/xenstat/xentop/xentop.c +16 -1
@@ -28,6 +28,7 @@#include <sys/time.h> #include <time.h> #include <unistd.h> +#include <signal.h> #if defined(__linux__)#include <linux/kdev_t.h> #endif
@@ -1011,6 +1012,12 @@ static void top(void)free (domains); } +static volatile int sigout_flag =0 ; + +void a_sig_handler (int sig) { + sigout_flag =1 ; +} +int main (int argc,char **argv) {int opt, optind =0 ;
@@ -1102,6 +1109,14 @@ int main(int argc, char **argv) ch =getch (); }while (handle_key (ch)); }else { +struct sigaction sa = { + .sa_handler = a_sig_handler, + .sa_flags =0 + }; +sigemptyset (&sa.sa_mask); +sigaction (SIGINT , &sa,NULL ); +sigaction (SIGTERM , &sa,NULL ); + do { gettimeofday(&curtime, NULL); top();
@@ -1109,7 +1124,7 @@ int main(int argc, char **argv)if ((!loop) && !(--iterations))break ;sleep (delay); - }while (1 ); + }while (sigout_flag ==0 ); }/* Cleanup occurs in cleanup(), so no work to do here. */