aboutsummaryrefslogtreecommitdiffstats
path: root/src/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/process.c')
-rw-r--r--src/process.c39
1 files changed, 8 insertions, 31 deletions
diff --git a/src/process.c b/src/process.c
index a371dece250..c654369627d 100644
--- a/src/process.c
+++ b/src/process.c
@@ -1609,14 +1609,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
1609#if !defined (WINDOWSNT) && defined (FD_CLOEXEC) 1609#if !defined (WINDOWSNT) && defined (FD_CLOEXEC)
1610 int wait_child_setup[2]; 1610 int wait_child_setup[2];
1611#endif 1611#endif
1612#ifdef SIGCHLD
1612 sigset_t blocked, procmask; 1613 sigset_t blocked, procmask;
1613 struct sigaction sigint_action;
1614 struct sigaction sigquit_action;
1615 struct sigaction sigpipe_action;
1616#ifdef AIX
1617 struct sigaction sighup_action;
1618#endif 1614#endif
1619 /* Use volatile to protect variables from being clobbered by longjmp. */ 1615 /* Use volatile to protect variables from being clobbered by vfork. */
1620 volatile int forkin, forkout; 1616 volatile int forkin, forkout;
1621 volatile int pty_flag = 0; 1617 volatile int pty_flag = 0;
1622 1618
@@ -1708,25 +1704,13 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
1708 XPROCESS (process)->pty_flag = pty_flag; 1704 XPROCESS (process)->pty_flag = pty_flag;
1709 pset_status (XPROCESS (process), Qrun); 1705 pset_status (XPROCESS (process), Qrun);
1710 1706
1707#ifdef SIGCHLD
1711 /* Delay interrupts until we have a chance to store 1708 /* Delay interrupts until we have a chance to store
1712 the new fork's pid in its process structure */ 1709 the new fork's pid in its process structure */
1713 sigemptyset (&blocked); 1710 sigemptyset (&blocked);
1714#ifdef SIGCHLD
1715 sigaddset (&blocked, SIGCHLD); 1711 sigaddset (&blocked, SIGCHLD);
1716#endif
1717#ifdef HAVE_WORKING_VFORK
1718 /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal',
1719 this sets the parent's signal handlers as well as the child's.
1720 So delay all interrupts whose handlers the child might munge,
1721 and record the current handlers so they can be restored later. */
1722 sigaddset (&blocked, SIGINT ); sigaction (SIGINT , 0, &sigint_action );
1723 sigaddset (&blocked, SIGQUIT); sigaction (SIGQUIT, 0, &sigquit_action);
1724 sigaddset (&blocked, SIGPIPE); sigaction (SIGPIPE, 0, &sigpipe_action);
1725#ifdef AIX
1726 sigaddset (&blocked, SIGHUP ); sigaction (SIGHUP , 0, &sighup_action );
1727#endif
1728#endif /* HAVE_WORKING_VFORK */
1729 pthread_sigmask (SIG_BLOCK, &blocked, &procmask); 1712 pthread_sigmask (SIG_BLOCK, &blocked, &procmask);
1713#endif
1730 1714
1731 FD_SET (inchannel, &input_wait_mask); 1715 FD_SET (inchannel, &input_wait_mask);
1732 FD_SET (inchannel, &non_keyboard_wait_mask); 1716 FD_SET (inchannel, &non_keyboard_wait_mask);
@@ -1879,8 +1863,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
1879 in the child. */ 1863 in the child. */
1880 signal (SIGPIPE, SIG_DFL); 1864 signal (SIGPIPE, SIG_DFL);
1881 1865
1866#ifdef SIGCHLD
1882 /* Stop blocking signals in the child. */ 1867 /* Stop blocking signals in the child. */
1883 pthread_sigmask (SIG_SETMASK, &procmask, 0); 1868 pthread_sigmask (SIG_SETMASK, &procmask, 0);
1869#endif
1884 1870
1885 if (pty_flag) 1871 if (pty_flag)
1886 child_setup_tty (xforkout); 1872 child_setup_tty (xforkout);
@@ -1959,19 +1945,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
1959#endif 1945#endif
1960 } 1946 }
1961 1947
1962 /* Restore the signal state whether vfork succeeded or not. 1948#ifdef SIGCHLD
1963 (We will signal an error, below, if it failed.) */
1964#ifdef HAVE_WORKING_VFORK
1965 /* Restore the parent's signal handlers. */
1966 sigaction (SIGINT, &sigint_action, 0);
1967 sigaction (SIGQUIT, &sigquit_action, 0);
1968 sigaction (SIGPIPE, &sigpipe_action, 0);
1969#ifdef AIX
1970 sigaction (SIGHUP, &sighup_action, 0);
1971#endif
1972#endif /* HAVE_WORKING_VFORK */
1973 /* Stop blocking signals in the parent. */ 1949 /* Stop blocking signals in the parent. */
1974 pthread_sigmask (SIG_SETMASK, &procmask, 0); 1950 pthread_sigmask (SIG_SETMASK, &procmask, 0);
1951#endif
1975 1952
1976 /* Now generate the error if vfork failed. */ 1953 /* Now generate the error if vfork failed. */
1977 if (pid < 0) 1954 if (pid < 0)