waitpid(...)
public
Waits for a child process to exit, returns its process id, and sets
$? to a Process::Status object containing
information on that process. Which child it waits on depends on the value
of pid:
> 0: | Waits for the child whose process ID equals pid.
|
0: | Waits for any child whose process group ID equals that of the calling
process.
|
-1: | Waits for any child process (the default if no pid is given).
|
< -1: | Waits for any child whose process group ID equals the absolute value of
pid.
|
The flags argument may be a logical or of the flag values
Process::WNOHANG (do not block if no child available) or
Process::WUNTRACED (return stopped children that haven’t
been reported). Not all flags are available on all platforms, but a flag
value of zero will work on all platforms.
Calling this method raises a SystemError if there are no child
processes. Not available on all platforms.
include Process
fork { exit 99 }
wait
$?.exitstatus
pid = fork { sleep 3 }
Time.now
waitpid(pid, Process::WNOHANG)
Time.now
waitpid(pid, 0)
Time.now
Show source
/*
* call-seq:
* Process.wait() => fixnum
* Process.wait(pid=-1, flags=0) => fixnum
* Process.waitpid(pid=-1, flags=0) => fixnum
*
* Waits for a child process to exit, returns its process id, and
* sets <code>$?</code> to a <code>Process::Status</code> object
* containing information on that process. Which child it waits on
* depends on the value of _pid_:
*
* > 0:: Waits for the child whose process ID equals _pid_.
*
* 0:: Waits for any child whose process group ID equals that of the
* calling process.
*
* -1:: Waits for any child process (the default if no _pid_ is
* given).
*
* < -1:: Waits for any child whose process group ID equals the absolute
* value of _pid_.
*
* The _flags_ argument may be a logical or of the flag values
* <code>Process::WNOHANG</code> (do not block if no child available)
* or <code>Process::WUNTRACED</code> (return stopped children that
* haven't been reported). Not all flags are available on all
* platforms, but a flag value of zero will work on all platforms.
*
* Calling this method raises a <code>SystemError</code> if there are
* no child processes. Not available on all platforms.
*
* include Process
* fork { exit 99 }
* wait
* $?.exitstatus
*
* pid = fork { sleep 3 }
* Time.now
* waitpid(pid, Process::WNOHANG)
* Time.now
* waitpid(pid, 0)
* Time.now
*/
static VALUE
proc_wait(argc, argv)
int argc;
VALUE *argv;
{
VALUE vpid, vflags;
int pid, flags, status;
rb_secure(2);
flags = 0;
rb_scan_args(argc, argv, "02", &vpid, &vflags);
if (argc == 0) {
pid = -1;
}
else {
pid = NUM2INT(vpid);
if (argc == 2 && !NIL_P(vflags)) {
flags = NUM2UINT(vflags);
}
}
if ((pid = rb_waitpid(pid, &status, flags)) < 0)
rb_sys_fail(0);
if (pid == 0) {
return rb_last_status = Qnil;
}
return INT2FIX(pid);
}