INAKOSHI Hiroya
2007-Oct-02 01:22 UTC
[Xen-devel] [PATCH] SIGTERM and SIGINT handler to flush xentop -b outputs
# HG changeset patch # User inakoshi.hiroya@jp.fujitsu.com # Date 1191287395 -28800 # Node ID 5543e74774a826b1781893982ed5052312b820fc # Parent 83239b2890723e0c06bad507bb273a970784b18e 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. Signed-off-by: INAKOSHI Hiroya <inakoshi.hiroya@jp.fujitsu.com> diff -r 83239b289072 -r 5543e74774a8 tools/xenstat/xentop/xentop.c --- a/tools/xenstat/xentop/xentop.c Thu Sep 27 16:29:43 2007 -0600 +++ b/tools/xenstat/xentop/xentop.c Tue Oct 02 09:09:55 2007 +0800 @@ -31,6 +31,7 @@ #if defined(__linux__) #include <linux/kdev_t.h> #endif +#include <signal.h> #include <xenstat.h> @@ -1011,6 +1012,13 @@ static void top(void) free(domains); } + +void a_sig_handler(int n) +{ + fflush(stdout); + exit(0); +} + int main(int argc, char **argv) { int opt, optind = 0; @@ -1102,6 +1110,8 @@ int main(int argc, char **argv) ch = getch(); } while (handle_key(ch)); } else { + signal(SIGTERM, a_sig_handler); + signal(SIGINT, a_sig_handler); do { gettimeofday(&curtime, NULL); top(); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
John Levon
2007-Oct-02 01:29 UTC
Re: [Xen-devel] [PATCH] SIGTERM and SIGINT handler to flush xentop -b outputs
On Tue, Oct 02, 2007 at 10:22:16AM +0900, INAKOSHI Hiroya wrote:> +void a_sig_handler(int n) > +{ > + fflush(stdout); > + exit(0); > +}Neither exit() nor fflush() are guaranteed signal safe: http://opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html#tag_02_04_03 so can''t be used in signal handlers.> } else { > + signal(SIGTERM, a_sig_handler); > + signal(SIGINT, a_sig_handler);There''s never a reason to use signal() these days, even if you made the handler use _exit() regards john _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
INAKOSHI Hiroya
2007-Oct-02 10:57 UTC
Re: [Xen-devel] [PATCH] SIGTERM and SIGINT handler to flush xentop -b outputs
John, thanks for your comment. I see your point. I will post another patch in a separate e-mail. It uses a signal handler in a safe manner. Regards, Hiroya John Levon wrote:> On Tue, Oct 02, 2007 at 10:22:16AM +0900, INAKOSHI Hiroya wrote: > >> +void a_sig_handler(int n) >> +{ >> + fflush(stdout); >> + exit(0); >> +} > > Neither exit() nor fflush() are guaranteed signal safe: > > http://opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html#tag_02_04_03 > > so can''t be used in signal handlers. > >> } else { >> + signal(SIGTERM, a_sig_handler); >> + signal(SIGINT, a_sig_handler); > > There''s never a reason to use signal() these days, even if you made the > handler use _exit() > > regards > john > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
INAKOSHI Hiroya
2007-Oct-02 11:10 UTC
[Xen-devel] [PATCH] 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 <inakoshi.hiroya@jp.fujitsu.com> diff -r 83239b289072 tools/xenstat/xentop/xentop.c --- a/tools/xenstat/xentop/xentop.c Thu Sep 27 16:29:43 2007 -0600 +++ b/tools/xenstat/xentop/xentop.c Tue Oct 02 16:53:10 2007 +0900 @@ -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. */ _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Reasonably Related Threads
- [PATCH] xentrace event mask for memory management class
- [PATCH][TOOLS] pygrub: cleanup and support for NetBSD
- Much difference between netperf results on every run
- [Patch] Fixed typos about vncunused in xmexamples
- [PATCH] boot with default on dom0_mem allocation failure.