類別 Process::Status
一個 Process::Status
包含有關系統程序的資訊。
執行緒局部變數 $?
最初為 nil
。有些方法會將一個表示系統程序(執行中或已終止)的 Process::Status
物件指定給它
`ruby -e "exit 99"` stat = $? # => #<Process::Status: pid 1262862 exit 99> stat.class # => Process::Status stat.to_i # => 25344 stat.stopped? # => false stat.exited? # => true stat.exitstatus # => 99
公開類別方法
類似 Process.wait
,但會傳回一個 Process::Status
物件(而不是整數 pid 或 nil);請參閱 Process.wait
以取得 pid
和 flags
的值。
如果存在子程序,則會等待子程序結束,並傳回一個包含該程序資訊的 Process::Status
物件;設定執行緒局部變數 $?
Process.spawn('cat /nop') # => 1155880 Process::Status.wait # => #<Process::Status: pid 1155880 exit 1> $? # => #<Process::Status: pid 1155508 exit 1>
如果沒有子程序,則會傳回一個不表示實際程序的「空」Process::Status
物件;不會設定執行緒局部變數 $?
Process::Status.wait # => #<Process::Status: pid -1 exit 0> $? # => #<Process::Status: pid 1155508 exit 1> # Unchanged.
可能會呼叫排程器掛勾 Fiber::Scheduler#process_wait
。
並非所有平台都可用。
static VALUE rb_process_status_waitv(int argc, VALUE *argv, VALUE _) { rb_check_arity(argc, 0, 2); rb_pid_t pid = -1; int flags = 0; if (argc >= 1) { pid = NUM2PIDT(argv[0]); } if (argc >= 2) { flags = RB_NUM2INT(argv[1]); } return rb_process_status_wait(pid, flags); }
公開執行個體方法
此方法已標示為不建議使用,因為 to_i
值取決於系統;請使用謂詞方法,例如 exited?
或 stopped?
,或取得器,例如 exitstatus
或 stopsig
。
傳回 to_i
值與 mask
的邏輯 AND
`cat /nop` stat = $? # => #<Process::Status: pid 1155508 exit 1> sprintf('%x', stat.to_i) # => "100" stat & 0x00 # => 0
如果 mask
為負數,則會引發 ArgumentError
。
static VALUE pst_bitand(VALUE st1, VALUE st2) { int status = PST2INT(st1); int mask = NUM2INT(st2); if (mask < 0) { rb_raise(rb_eArgError, "negative mask value: %d", mask); } #define WARN_SUGGEST(suggest) \ rb_warn_deprecated_to_remove_at(3.4, "Process::Status#&", suggest) switch (mask) { case 0x80: WARN_SUGGEST("Process::Status#coredump?"); break; case 0x7f: WARN_SUGGEST("Process::Status#signaled? or Process::Status#termsig"); break; case 0xff: WARN_SUGGEST("Process::Status#exited?, Process::Status#stopped? or Process::Status#coredump?"); break; case 0xff00: WARN_SUGGEST("Process::Status#exitstatus or Process::Status#stopsig"); break; default: WARN_SUGGEST("other Process::Status predicates"); break; } #undef WARN_SUGGEST status &= mask; return INT2NUM(status); }
傳回 to_i
值是否 == other
`cat /nop` stat = $? # => #<Process::Status: pid 1170366 exit 1> sprintf('%x', stat.to_i) # => "100" stat == 0x100 # => true
static VALUE pst_equal(VALUE st1, VALUE st2) { if (st1 == st2) return Qtrue; return rb_equal(pst_to_i(st1), st2); }
此方法已標示為不建議使用,因為 to_i
值取決於系統;請使用謂詞方法,例如 exited?
或 stopped?
,或取得器,例如 exitstatus
或 stopsig
。
傳回 to_i
的值,向右位移 places
位元
`cat /nop` stat = $? # => #<Process::Status: pid 1155508 exit 1> stat.to_i # => 256 stat >> 1 # => 128 stat >> 2 # => 64
如果 places
為負數,會引發 ArgumentError
。
static VALUE pst_rshift(VALUE st1, VALUE st2) { int status = PST2INT(st1); int places = NUM2INT(st2); if (places < 0) { rb_raise(rb_eArgError, "negative shift value: %d", places); } #define WARN_SUGGEST(suggest) \ rb_warn_deprecated_to_remove_at(3.4, "Process::Status#>>", suggest) switch (places) { case 7: WARN_SUGGEST("Process::Status#coredump?"); break; case 8: WARN_SUGGEST("Process::Status#exitstatus or Process::Status#stopsig"); break; default: WARN_SUGGEST("other Process::Status attributes"); break; } #undef WARN_SUGGEST status >>= places; return INT2NUM(status); }
如果程序終止時產生核心傾印,傳回 true
;否則傳回 false
。
並非所有平台都可用。
static VALUE pst_wcoredump(VALUE st) { #ifdef WCOREDUMP int status = PST2INT(st); return RBOOL(WCOREDUMP(status)); #else return Qfalse; #endif }
如果程序正常結束(例如使用 exit()
呼叫或結束程序),傳回 true
;否則傳回 false
。
static VALUE pst_wifexited(VALUE st) { int status = PST2INT(st); return RBOOL(WIFEXITED(status)); }
如果程序已結束,傳回程序回傳碼的最後八個位元;否則傳回 nil
。
`exit 99` $?.exitstatus # => 99
static VALUE pst_wexitstatus(VALUE st) { int status = PST2INT(st); if (WIFEXITED(status)) return INT2NUM(WEXITSTATUS(status)); return Qnil; }
傳回 self
的字串表示。
system("false") $?.inspect # => "#<Process::Status: pid 1303494 exit 1>"
static VALUE pst_inspect(VALUE st) { rb_pid_t pid; int status; VALUE str; pid = pst_pid(st); if (!pid) { return rb_sprintf("#<%s: uninitialized>", rb_class2name(CLASS_OF(st))); } status = PST2INT(st); str = rb_sprintf("#<%s: ", rb_class2name(CLASS_OF(st))); pst_message(str, pid, status); rb_str_cat2(str, ">"); return str; }
傳回程序的程序 ID。
system("false") $?.pid # => 1247002
static VALUE pst_pid_m(VALUE self) { rb_pid_t pid = pst_pid(self); return PIDT2NUM(pid); }
如果程序因未捕捉的訊號而終止,傳回 true
;否則傳回 false
。
static VALUE pst_wifsignaled(VALUE st) { int status = PST2INT(st); return RBOOL(WIFSIGNALED(status)); }
如果此程序已停止,且對應的等待呼叫已設定 Process::WUNTRACED 旗標,傳回 true
;否則傳回 false
。
static VALUE pst_wifstopped(VALUE st) { int status = PST2INT(st); return RBOOL(WIFSTOPPED(status)); }
傳回導致程序停止的訊號編號,如果程序未停止,則傳回 nil
。
static VALUE pst_wstopsig(VALUE st) { int status = PST2INT(st); if (WIFSTOPPED(status)) return INT2NUM(WSTOPSIG(status)); return Qnil; }
傳回
-
如果程序已成功完成並結束,傳回
true
。 -
如果程序已不成功完成並結束,傳回
false
。 -
如果程序尚未結束,傳回
nil
。
static VALUE pst_success_p(VALUE st) { int status = PST2INT(st); if (!WIFEXITED(status)) return Qnil; return RBOOL(WEXITSTATUS(status) == EXIT_SUCCESS); }
傳回導致程序終止的訊號編號,如果程序並非因未捕捉的訊號而終止,則傳回 nil
。
static VALUE pst_wtermsig(VALUE st) { int status = PST2INT(st); if (WIFSIGNALED(status)) return INT2NUM(WTERMSIG(status)); return Qnil; }
傳回系統相依的 self
整數狀態
`cat /nop` $?.to_i # => 256
static VALUE pst_to_i(VALUE self) { int status = pst_status(self); return RB_INT2NUM(status); }
傳回 self
的字串表示。
`cat /nop` $?.to_s # => "pid 1262141 exit 1"
static VALUE pst_to_s(VALUE st) { rb_pid_t pid; int status; VALUE str; pid = pst_pid(st); status = PST2INT(st); str = rb_str_buf_new(0); pst_message(str, pid, status); return str; }