こんにちは。みかみにございます。

 いつもお世話になっています。今回は、waitpid2
が返す終了ステータスについて教えて頂きたく、投稿
しました。よろしくお願いします。

 waitpid2 の返す子プロセスの終了ステータスが
同じコマンドをシェルで実行したときに返される終了
ステータスと違うので、どうしてなのか教えて
頂きたいのです。

 その違いとは、例えば次のものです。

% cat test.rb
#!/usr/bin/ruby

def exec_exit(cmd)
  pid = fork do
    exec(cmd)
  end
  stat = Process.waitpid2(pid)[1]
  print "Cmd\t", cmd, "\nStat\t", stat, "\n\n"
end

exec_exit('ruby -e "exit 0"')
exec_exit('ruby -e "exit 1"')
exec_exit('ruby -e "exit 2"')
exec_exit('grep hoge test.rb > /dev/null')
exec_exit('grep "^fuga" test.rb > /dev/null')
exec_exit('grep -j "^hige" test.rb 2> /dev/null')

% ruby -e "exit 0" ; echo $?
0
% ruby -e "exit 1" ; echo $?
1
% ruby -e "exit 2" ; echo $?
2
% grep hoge test.rb > /dev/null ; echo $?
0
% grep "^fuga" test.rb > /dev/null ; echo $?
1
% grep -j "^hige" test.rb 2> /dev/null ; echo $?
2
% ./test.rb
Cmd     ruby -e "exit 0"
Stat    0

Cmd     ruby -e "exit 1"
Stat    256

Cmd     ruby -e "exit 2"
Stat    512

Cmd     grep hoge test.rb > /dev/null
Stat    0

Cmd     grep "^fuga" test.rb > /dev/null
Stat    256

Cmd     grep -j "^hige" test.rb 2> /dev/null
Stat    512


 このようにシェルで実行して得た終了ステータスと
Ruby の fork と exec による子プロセスで実行して得た
終了ステータスは次のようになっています。

  sh      0      1      2
  Ruby    0    256    512

 256倍というのが引っかかるのですが、どうしてこう
なるのでしょうか。仕様なのか、バグなのか、仕様だと
したらどういう風に使うものなのか、この点を教えて
頂ければ幸いです。

 なお、僕の環境は Vine Linux 2.1、Ruby 1.6.3 です。
どうぞよろしくお願いします。
    ______________________________________________________
   /                                               ______/
  /    三上   雅人 - 英語表記も姓名順です        _____/
 /   Mikami Masato - ↓新規書込通知機能 12/16  ____/
/       興  風  館 - http://kofukan.nmn.jp/  ___/