summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-18 14:36:15 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-18 14:36:15 +0000
commit620bb29f49eba7da02ea348ebd2b8317b2235c18 (patch)
treeffd765ea505bce9eadc168951154986cf1a4b82d /process.c
parent45b085a0b221c89643f558118bb25204dd9bb7e3 (diff)
* process.c (rb_f_system): block SIGCHLD during the process
execution, like glibc system(3) does. [ruby-talk:202361] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/process.c b/process.c
index 1b6f133..4271c2f 100644
--- a/process.c
+++ b/process.c
@@ -1492,7 +1492,9 @@ rb_f_system(argc, argv)
volatile VALUE prog = 0;
int pid;
int i;
+ RETSIGTYPE (*chfunc)(int);
+ chfunc = signal(SIGCHLD, SIG_DFL);
fflush(stdout);
fflush(stderr);
if (argc == 0) {
@@ -1515,8 +1517,9 @@ rb_f_system(argc, argv)
SafeStringValue(argv[i]);
}
retry:
- switch (pid = fork()) {
- case 0:
+ pid = fork();
+ if (pid == 0) {
+ /* child process */
if (argc == 1 && prog == 0) {
rb_proc_exec(RSTRING(argv[0])->ptr);
}
@@ -1524,20 +1527,18 @@ rb_f_system(argc, argv)
proc_exec_n(argc, argv, prog);
}
_exit(127);
- break; /* not reached */
-
- case -1:
+ }
+ if (pid < 0) {
if (errno == EAGAIN) {
rb_thread_sleep(1);
goto retry;
}
- rb_sys_fail(0);
- break;
-
- default:
+ }
+ else {
rb_syswait(pid);
}
- if (NIL_P(rb_last_status)) rb_sys_fail(0);
+ signal(SIGCHLD, chfunc);
+ if (pid < 0) rb_sys_fail(0);
status = NUM2INT(rb_last_status);
#endif
@@ -1597,6 +1598,10 @@ rb_f_sleep(argc, argv)
* Process.getpgrp #=> 25527
*/
+#if defined(SIGCLD) && !defined(SIGCHLD)
+# define SIGCHLD SIGCLD
+#endif
+
static VALUE
proc_getpgrp()
{