Revision: 147224 https://trac.macports.org/changeset/147224 Author: raimue@macports.org Date: 2016-03-31 08:53:21 -0700 (Thu, 31 Mar 2016) Log Message: ----------- pextlib/system: ignore signals SIGINT/SIGQUIT When a SIGINT/SIGQUIT was generated by the user during execution of a program, both the program and the waiting parent tclsh process got interrupted by a signal. However, the handler in the tclsh only generated an unpleasant error message that a SIGINT/SIGQUIT was received. With this change, only the child will handle the signal, hopefully ending its execution. If the program handles SIGINT/SIGQUIT, it might still just terminate with a normal exit code, so there is no chance for us to determine that it was killed by a signal. Modified Paths: -------------- trunk/base/src/pextlib1.0/system.c Modified: trunk/base/src/pextlib1.0/system.c =================================================================== --- trunk/base/src/pextlib1.0/system.c 2016-03-31 15:33:52 UTC (rev 147223) +++ trunk/base/src/pextlib1.0/system.c 2016-03-31 15:53:21 UTC (rev 147224) @@ -56,6 +56,7 @@ #include <unistd.h> #include <limits.h> #include <errno.h> +#include <signal.h> #include "system.h" #include "sip_copy_proc.h" @@ -187,6 +188,22 @@ } } + /* + * Ignore SIGINT and SIGQUIT, just like system(3) + * + * system(3) also blocks SIGCHLD during the execution of the program. + * However, that would make our wait(2) call more complicated. As we are + * not relying on delivery of SIGCHLD anywhere else, we just do not change + * the handling here at all. + */ + struct sigaction sa, old_sa_int, old_sa_quit; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + sigaction(SIGINT, &sa, &old_sa_int); + sigaction(SIGQUIT, &sa, &old_sa_quit); + + /* fork a new process */ pid = fork(); switch (pid) { case -1: /* error */ @@ -229,6 +246,10 @@ } } + /* restore original signal handling */ + sigaction(SIGINT, &old_sa_int, NULL); + sigaction(SIGQUIT, &old_sa_quit, NULL); + /* XXX ugly string constants */ if (sandbox) { args[0] = "sandbox-exec"; @@ -342,6 +363,10 @@ } } + /* restore original signal handling */ + sigaction(SIGINT, &old_sa_int, NULL); + sigaction(SIGQUIT, &old_sa_quit, NULL); + if (odup) { /* Cleanup. */ close(fdset[0]);
participants (1)
-
raimue@macports.org