From 865ca149dcac626ebca40ae3ea5c8009af91e671 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Sun, 1 Sep 2013 19:59:54 +0000 Subject: system(): Restore behaviour for SIGINT and SIGQUIT. As mentioned in r16117 and the book "Advanced Programming in the Unix Environment" by W. Richard Stevens, we should ignore SIGINT and SIGQUIT before forking, since it is not guaranteed that the parent process starts running soon enough. To avoid calling sigaction() in the vforked child, instead block SIGINT and SIGQUIT before vfork() and keep the sigaction() to ignore after vfork(). The FreeBSD kernel discards ignored signals, even if they are blocked; therefore, it is not necessary to unblock SIGINT and SIGQUIT earlier. --- lib/libc/stdlib/system.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/libc/stdlib/system.c') diff --git a/lib/libc/stdlib/system.c b/lib/libc/stdlib/system.c index 64a5447145645..e018e6ff0b72f 100644 --- a/lib/libc/stdlib/system.c +++ b/lib/libc/stdlib/system.c @@ -59,6 +59,8 @@ __system(const char *command) (void)sigemptyset(&newsigblock); (void)sigaddset(&newsigblock, SIGCHLD); + (void)sigaddset(&newsigblock, SIGINT); + (void)sigaddset(&newsigblock, SIGQUIT); (void)_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock); switch(pid = vfork()) { case -1: /* error */ -- cgit v1.2.3