From: Andre Noll Date: Sat, 5 Mar 2016 21:10:32 +0000 (+0100) Subject: gui: Kill process group *before* shutting down curses. X-Git-Tag: v0.5.6~23^2~4 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=2a4d61a8966e984eb9bea74a6c7a4a7cfd999e70;hp=0bc88a7bbfacdce3caa5dd26dabe046ab20b2f6d gui: Kill process group *before* shutting down curses. Currently we perform shutdown on exit the other way round. Hence the running external command may interfere with the shutdown of the curses system. This patch changes die() to first signal the child processes, then wait for them to terminate. This avoids the race. --- diff --git a/gui.c b/gui.c index e85edba9..83337f86 100644 --- a/gui.c +++ b/gui.c @@ -518,6 +518,14 @@ __noreturn __printf_2_3 static void die(int exit_code, const char* fmt, ...) { va_list argp; + /* Kill every process in our process group. */ + para_sigaction(SIGTERM, SIG_IGN); + kill(0, SIGTERM); + /* Wait up to two seconds for child processes to die. */ + alarm(2); + while (waitpid(0, NULL, 0) >= 0) + ; /* nothing */ + alarm(0); /* mousemask() exists only in ncurses */ #ifdef NCURSES_MOUSE_VERSION mousemask(~(mmask_t)0, NULL); /* Avoid bad terminal state with xterm. */ @@ -526,9 +534,6 @@ __noreturn __printf_2_3 static void die(int exit_code, const char* fmt, ...) va_start(argp, fmt); vfprintf(stderr, fmt, argp); va_end(argp); - /* kill every process in the process group and exit */ - para_sigaction(SIGTERM, SIG_IGN); - kill(0, SIGTERM); exit(exit_code); }