summaryrefslogtreecommitdiffstats
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
commit69e34098cfb9fc239487a42f89b2abe3bd158d6a (patch)
treeffd765ea505bce9eadc168951154986cf1a4b82d /process.c
parentaef6cd7c5bba53bde166de5e971f85d5ed456a1e (diff)
downloadruby-69e34098cfb9fc239487a42f89b2abe3bd158d6a.tar.gz
ruby-69e34098cfb9fc239487a42f89b2abe3bd158d6a.tar.xz
ruby-69e34098cfb9fc239487a42f89b2abe3bd158d6a.zip
* process.c (rb_f_system): block SIGCHLD during the process
execution, like glibc system(3) does. [ruby-talk:202361] git-svn-id: http://svn.ruby-lang.org/repos/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 1b6f13383..4271c2ff1 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()
{