Skip to contentSkip to conversation

SIGTERM and SIGINT handler to flush xentop -b outputs

PATCH New INAKOSHI Hiroya 1 participant 1 message Oct 2, 2007

lore
Share & tools
lore
#0 lore raw

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.

tools/xenstat/xentop/xentop.c +16 -1
diff -r 83239b289072 tools/xenstat/xentop/xentop.c
@@ -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. */