Mercurial > emacs
changeset 14131:7717b68abd2e
(create_process): Restore the signal state
after vfork whether it succeeds or not.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Tue, 09 Jan 1996 23:40:33 +0000 |
parents | 99ab26698ab0 |
children | 85063feb159b |
files | src/process.c |
diffstat | 1 files changed, 31 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/src/process.c Tue Jan 09 23:40:19 1996 +0000 +++ b/src/process.c Tue Jan 09 23:40:33 1996 +0000 @@ -1519,42 +1519,47 @@ environ = save_environ; } + /* This runs in the Emacs process. */ if (pid < 0) { if (forkin >= 0) close (forkin); if (forkin != forkout && forkout >= 0) close (forkout); - report_file_error ("Doing vfork", Qnil); } - - XSETFASTINT (XPROCESS (process)->pid, pid); + else + { + /* vfork succeeded. */ + XSETFASTINT (XPROCESS (process)->pid, pid); #ifdef WINDOWSNT - register_child (pid, inchannel); + register_child (pid, inchannel); #endif /* WINDOWSNT */ - /* If the subfork execv fails, and it exits, - this close hangs. I don't know why. - So have an interrupt jar it loose. */ - stop_polling (); - signal (SIGALRM, create_process_1); - alarm (1); - XPROCESS (process)->subtty = Qnil; - if (forkin >= 0) - close (forkin); - alarm (0); - start_polling (); - if (forkin != forkout && forkout >= 0) - close (forkout); + /* If the subfork execv fails, and it exits, + this close hangs. I don't know why. + So have an interrupt jar it loose. */ + stop_polling (); + signal (SIGALRM, create_process_1); + alarm (1); + XPROCESS (process)->subtty = Qnil; + if (forkin >= 0) + close (forkin); + alarm (0); + start_polling (); + if (forkin != forkout && forkout >= 0) + close (forkout); #ifdef HAVE_PTYS - if (pty_flag) - XPROCESS (process)->tty_name = build_string (pty_name); - else + if (pty_flag) + XPROCESS (process)->tty_name = build_string (pty_name); + else #endif - XPROCESS (process)->tty_name = Qnil; - + XPROCESS (process)->tty_name = Qnil; + } + + /* Restore the signal state whether vfork succeeded or not. + (We will signal an error, below, if it failed.) */ #ifdef POSIX_SIGNALS #ifdef HAVE_VFORK /* Restore the parent's signal handlers. */ @@ -1585,6 +1590,10 @@ #endif /* not BSD4_1 */ #endif /* SIGCHLD */ #endif /* !POSIX_SIGNALS */ + + /* Now generate the error if vfork failed. */ + if (pid < 0) + report_file_error ("Doing vfork", Qnil); } #endif /* not VMS */