static public Method

Process.wait(...)

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 $? 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 }                 #=> 27429
wait                             #=> 27429
$?.exitstatus                    #=> 99

pid = fork { sleep 3 }           #=> 27440
Time.now                         #=> Wed Apr 09 08:57:09 CDT 2003
waitpid(pid, Process::WNOHANG)   #=> nil
Time.now                         #=> Wed Apr 09 08:57:09 CDT 2003
waitpid(pid, 0)                  #=> 27440
Time.now                         #=> Wed Apr 09 08:57:12 CDT 2003

Source Code

/*
*  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 }                 #=> 27429
*     wait                             #=> 27429
*     $?.exitstatus                    #=> 99
*
*     pid = fork { sleep 3 }           #=> 27440
*     Time.now                         #=> Wed Apr 09 08:57:09 CDT 2003
*     waitpid(pid, Process::WNOHANG)   #=> nil
*     Time.now                         #=> Wed Apr 09 08:57:09 CDT 2003
*     waitpid(pid, 0)                  #=> 27440
*     Time.now                         #=> Wed Apr 09 08:57:12 CDT 2003
*/

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);
}
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.