class Process::Status
A 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
Общедоступные методы класса
Исходный код
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);
} Аналогично 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
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.5, "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 является зависящим от системы; используйте предикатные методы, такие как exited? или stopped?, или геттеры, такие как exitstatus или stopsig.
Возвращает логическое И значения to_i с mask:
`cat /nop`
stat = $? # => #<Process::Status: pid 1155508 exit 1>
sprintf('%x', stat.to_i) # => "100"
stat & 0x00 # => 0
ArgumentError возникает, если mask отрицательно.
Исходный код
static VALUE
pst_equal(VALUE st1, VALUE st2)
{
if (st1 == st2) return Qtrue;
return rb_equal(pst_to_i(st1), st2);
} Возвращает, является ли значение to_i == other:
`cat /nop`
stat = $? # => #<Process::Status: pid 1170366 exit 1>
sprintf('%x', stat.to_i) # => "100"
stat == 0x100 # => true
Исходный код
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.5, "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);
} Этот метод устарел, так как значение 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
ArgumentError возникает, если places отрицательно.
Исходный код
static VALUE
pst_wcoredump(VALUE st)
{
#ifdef WCOREDUMP
int status = PST2INT(st);
return RBOOL(WCOREDUMP(status));
#else
return Qfalse;
#endif
} Возвращает true если процесс сгенерировал дамп памяти при завершении, false если нет.
Недоступно на всех платформах.
Исходный код
static VALUE
pst_wifexited(VALUE st)
{
int status = PST2INT(st);
return RBOOL(WIFEXITED(status));
} Возвращает true если процесс завершился нормально (например, используя вызов exit() или завершение программы), false если нет.
Исходный код
static VALUE
pst_wexitstatus(VALUE st)
{
int status = PST2INT(st);
if (WIFEXITED(status))
return INT2NUM(WEXITSTATUS(status));
return Qnil;
} Возвращает младшие восемь бит кода возврата процесса, если он завершился; nil иначе:
`exit 99` $?.exitstatus # => 99
Исходный код
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;
} Возвращает строковое представление self:
system("false")
$?.inspect # => "#<Process::Status: pid 1303494 exit 1>"
Исходный код
static VALUE
pst_pid_m(VALUE self)
{
rb_pid_t pid = pst_pid(self);
return PIDT2NUM(pid);
} Возвращает идентификатор процесса:
system("false")
$?.pid # => 1247002
Исходный код
static VALUE
pst_wifsignaled(VALUE st)
{
int status = PST2INT(st);
return RBOOL(WIFSIGNALED(status));
} Возвращает true если процесс завершился из-за неперехваченного сигнала, false иначе.
Исходный код
static VALUE
pst_wifstopped(VALUE st)
{
int status = PST2INT(st);
return RBOOL(WIFSTOPPED(status));
} Возвращает true если этот процесс остановлен, и если соответствующий вызов wait имел установленный флаг Process::WUNTRACED, false иначе.
Исходный код
static VALUE
pst_wstopsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSTOPPED(status))
return INT2NUM(WSTOPSIG(status));
return Qnil;
} Возвращает номер сигнала, который вызвал остановку процесса, или nil если процесс не остановлен.
Исходный код
static VALUE
pst_success_p(VALUE st)
{
int status = PST2INT(st);
if (!WIFEXITED(status))
return Qnil;
return RBOOL(WEXITSTATUS(status) == EXIT_SUCCESS);
} Возвращает:
-
trueесли процесс завершился успешно. -
falseесли процесс завершился неуспешно. -
nilесли процесс не завершился.
Исходный код
static VALUE
pst_wtermsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSIGNALED(status))
return INT2NUM(WTERMSIG(status));
return Qnil;
} Возвращает номер сигнала, который вызвал завершение процесса, или nil если процесс не был завершен неперехваченным сигналом.
Исходный код
static VALUE
pst_to_i(VALUE self)
{
int status = pst_status(self);
return RB_INT2NUM(status);
} Возвращает зависящий от системы целочисленный статус self:
`cat /nop` $?.to_i # => 256
Исходный код
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;
} Возвращает строковое представление self:
`cat /nop` $?.to_s # => "pid 1262141 exit 1"
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.