superclass=
type=module
library=_builtin
extended=
included=

ץνλơɽ饹Ǥ
᥽å [[m:Process.#wait2]] ʤɤ֤ͤȤƻȤޤ

=== 

wait Ѥ

  fork { exit }
  Process.wait
  case
  when $?.signaled?
    p "child #{$?.pid} was killed by signal #{$?.termsig}"
    if $?.coredump?   # ƥबΥơ򥵥ݡȤƤʤоfalse
      p "child #{$?.pid} dumped core."
    end
  when $?.stopped?
    # ºݤˤ Process.wait ѤƤΤǡ뤳ȤϤʤ
    p "child #{$?.pid} was stopped by signal #{$?.stopsig}"
  when $?.exited?
    p "child #{$?.pid} exited normally. status=#{$?.exitstatus}"
  else
    p "unknown status %#x" % $?.to_i
  end

SIGCHLD  trap 

  trap(:SIGCHLD) {|sig|

    puts "interrupted by signal #{sig} at #{caller[1]}"
    # ʣλҥץνλФ1Ĥ SIGCHLD Ϥʤ
    # 礬Τǥ롼פɬפޤ

    while Process.waitpid(-1, Process::WNOHANG|Process::WUNTRACED)
      case
      when $?.signaled?
        puts "   child #{$?.pid} was killed by signal #{$?.termsig}"
        if $?.coredump?
          puts "   child #{$?.pid} dumped core."
        end
      when $?.stopped?
        puts "   child #{$?.pid} was stopped by signal #{$?.stopsig}"
      when $?.exited?
        puts "   child #{$?.pid} exited normally. status=#{$?.exitstatus}"
      else
        p "unknown status %#x" % $?.to_i
      end
    end
  }

  p pid1 = fork { sleep 1; exit }
  p pid2 = fork { loop { sleep } } # signal ԤĤ sleep
  begin
     Process.kill :STOP, pid2
     sleep                      # SIGCHLD ԤĤ sleep
     Process.kill :CONT, pid2
     Process.kill :TERM, pid2
     loop { sleep }             # SIGCHLD ԤĤ sleep
  rescue Errno::ECHILD
    puts "done"
  end

  => 12964
     12965
     interrupted by signal 17 at -:27:in `sleep'
        child 12965 was stopped by signal 19
     interrupted by signal 17 at -:30:in `sleep'
        child 12965 was killed by signal 15
     interrupted by signal 17 at -:30:in `sleep'
        child 12964 exited normally. status=0
     done
