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.