Date: Sun, 1 Sep 2013 19:59:54 +0000 (UTC) From: Jilles Tjoelker <jilles@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r255129 - head/lib/libc/stdlib Message-ID: <201309011959.r81Jxs8Z045747@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jilles Date: Sun Sep 1 19:59:54 2013 New Revision: 255129 URL: http://svnweb.freebsd.org/changeset/base/255129 Log: 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. Modified: head/lib/libc/stdlib/system.c Modified: head/lib/libc/stdlib/system.c ============================================================================== --- head/lib/libc/stdlib/system.c Sun Sep 1 19:27:32 2013 (r255128) +++ head/lib/libc/stdlib/system.c Sun Sep 1 19:59:54 2013 (r255129) @@ -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 */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309011959.r81Jxs8Z045747>