類別 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::Status.wait(pid = -1, flags = 0) → Process::Status 按一下以切換來源

類似 Process.wait,但會傳回一個 Process::Status 物件(而不是整數 pid 或 nil);請參閱 Process.wait 以取得 pidflags 的值。

如果存在子程序,則會等待子程序結束,並傳回一個包含該程序資訊的 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);
}

公開執行個體方法

stat & mask → integer 按一下以切換來源

此方法已標示為不建議使用,因為 to_i 值取決於系統;請使用謂詞方法,例如 exited?stopped?,或取得器,例如 exitstatusstopsig

傳回 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);
}
stat == other → true or false 按一下以切換來源

傳回 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);
}
stat >> places → integer 按一下以切換來源

此方法已標示為不建議使用,因為 to_i 值取決於系統;請使用謂詞方法,例如 exited?stopped?,或取得器,例如 exitstatusstopsig

傳回 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);
}
coredump? → true 或 false 按一下以切換來源

如果程序終止時產生核心傾印,傳回 true;否則傳回 false

並非所有平台都可用。

static VALUE
pst_wcoredump(VALUE st)
{
#ifdef WCOREDUMP
    int status = PST2INT(st);

    return RBOOL(WCOREDUMP(status));
#else
    return Qfalse;
#endif
}
exited? → true 或 false 按一下以切換來源

如果程序正常結束(例如使用 exit() 呼叫或結束程序),傳回 true;否則傳回 false

static VALUE
pst_wifexited(VALUE st)
{
    int status = PST2INT(st);

    return RBOOL(WIFEXITED(status));
}
exitstatus → 整數或 nil 按一下以切換來源

如果程序已結束,傳回程序回傳碼的最後八個位元;否則傳回 nil

`exit 99`
$?.exitstatus # => 99
static VALUE
pst_wexitstatus(VALUE st)
{
    int status = PST2INT(st);

    if (WIFEXITED(status))
        return INT2NUM(WEXITSTATUS(status));
    return Qnil;
}
inspect → 字串 按一下以切換來源

傳回 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;
}
pid → 整數 按一下以切換來源

傳回程序的程序 ID。

system("false")
$?.pid # => 1247002
static VALUE
pst_pid_m(VALUE self)
{
    rb_pid_t pid = pst_pid(self);
    return PIDT2NUM(pid);
}
signaled? → true 或 false 按一下以切換來源

如果程序因未捕捉的訊號而終止,傳回 true;否則傳回 false

static VALUE
pst_wifsignaled(VALUE st)
{
    int status = PST2INT(st);

    return RBOOL(WIFSIGNALED(status));
}
stopped? → true 或 false 按一下以切換來源

如果此程序已停止,且對應的等待呼叫已設定 Process::WUNTRACED 旗標,傳回 true;否則傳回 false

static VALUE
pst_wifstopped(VALUE st)
{
    int status = PST2INT(st);

    return RBOOL(WIFSTOPPED(status));
}
stopsig → 整數或 nil 按一下以切換來源

傳回導致程序停止的訊號編號,如果程序未停止,則傳回 nil

static VALUE
pst_wstopsig(VALUE st)
{
    int status = PST2INT(st);

    if (WIFSTOPPED(status))
        return INT2NUM(WSTOPSIG(status));
    return Qnil;
}
success? → true、false 或 nil 按一下以切換來源

傳回

  • 如果程序已成功完成並結束,傳回 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);
}
termsig → 整數或 nil 按一下以切換來源

傳回導致程序終止的訊號編號,如果程序並非因未捕捉的訊號而終止,則傳回 nil

static VALUE
pst_wtermsig(VALUE st)
{
    int status = PST2INT(st);

    if (WIFSIGNALED(status))
        return INT2NUM(WTERMSIG(status));
    return Qnil;
}
to_i → 整數 按一下以切換來源

傳回系統相依的 self 整數狀態

`cat /nop`
$?.to_i # => 256
static VALUE
pst_to_i(VALUE self)
{
    int status = pst_status(self);
    return RB_INT2NUM(status);
}
to_s → 字串 按一下以切換來源

傳回 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;
}