svn commit: r255129 - head/lib/libc/stdlib

Jilles Tjoelker jilles at FreeBSD.org
Sun Sep 1 19:59:54 UTC 2013


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 */


More information about the svn-src-all mailing list