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