класс Process::Status
Process::Status инкапсулирует информацию о статусе работающего или завершенного системного процесса. Встроенная переменная $? равна либо nil , либо объекту Process::Status.
fork { exit 99 } #=> 26557
Process.wait #=> 26557
$?.class #=> Process::Status
$?.to_i #=> 25344
$? >> 8 #=> 99
$?.stopped? #=> false
$?.exited? #=> true
$?.exitstatus #=> 99
Системы Posix записывают информацию о процессах, используя 16-битовое целое число. Нижние биты записывают статус процесса (остановлен, завершен, сигнализирован), а верхние биты, возможно, содержат дополнительную информацию (например, код возврата программы в случае завершенных процессов). Перед Ruby 1.8 эти биты непосредственно передавались в программу Ruby. Сейчас Ruby инкапсулирует их в объект Process::Status. Однако, для максимальной совместимости, эти объекты сохраняют побитовый интерфейс. В описаниях ниже, когда мы говорим о целочисленном значении stat, мы имеем в виду это 16-битовое значение.
Публичные методы класса
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::Status, содержащий информацию об этом процессе. Какой дочерний процесс ожидает, зависит от значения pid:
- > 0
-
Ожидает дочерний процесс с идентификатором процесса, равным pid.
- 0
-
Ожидает любой дочерний процесс, группа процессов которого равна группе процессов вызывающего процесса.
- -1
-
Ожидает любой дочерний процесс (по умолчанию, если pid не указан).
- < -1
-
Ожидает любой дочерний процесс, группа процессов которого равна абсолютному значению pid.
Аргумент flags может быть логическим или оператором «или» значений флагов Process::WNOHANG (не блокировать, если доступен ни один дочерний процесс) или Process::WUNTRACED (возвращать остановленные дочерние процессы, которые еще не были сообщены). Не все флаги доступны на всех платформах, но значение флага ноль будет работать на всех платформах.
Возвращает nil , если дочерних процессов нет. Не доступно на всех платформах.
Может вызвать обработчик планировщика process_wait.
fork { exit 99 } #=> 27429
Process::Status.wait #=> pid 27429 exit 99
$? #=> nil
pid = fork { sleep 3 } #=> 27440
Time.now #=> 2008-03-08 19:56:16 +0900
Process::Status.wait(pid, Process::WNOHANG) #=> nil
Time.now #=> 2008-03-08 19:56:16 +0900
Process::Status.wait(pid, 0) #=> pid 27440 exit 99
Time.now #=> 2008-03-08 19:56:19 +0900
ЭТА ФУНКЦИЯ - ЭКСПЕРИМЕНТАЛЬНАЯ.
Общедоступные методы экземпляров
static VALUE
pst_bitand(VALUE st1, VALUE st2)
{
int status = PST2INT(st1) & NUM2INT(st2);
return INT2NUM(status);
} Логическое И побитово для stat и num.
fork { exit 0x37 }
Process.wait
sprintf('%04x', $?.to_i) #=> "3700"
sprintf('%04x', $? & 0x1e00) #=> "1600"
static VALUE
pst_equal(VALUE st1, VALUE st2)
{
if (st1 == st2) return Qtrue;
return rb_equal(pst_to_i(st1), st2);
} Возвращает true если целочисленное значение stat равно other.
static VALUE
pst_rshift(VALUE st1, VALUE st2)
{
int status = PST2INT(st1) >> NUM2INT(st2);
return INT2NUM(status);
} Сдвигает биты в stat вправо на num позиций.
fork { exit 99 } #=> 26563
Process.wait #=> 26563
$?.to_i #=> 25344
$? >> 8 #=> 99
static VALUE
pst_wcoredump(VALUE st)
{
#ifdef WCOREDUMP
int status = PST2INT(st);
if (WCOREDUMP(status))
return Qtrue;
else
return Qfalse;
#else
return Qfalse;
#endif
} Возвращает true если stat сгенерировал дамп памяти при завершении. Не доступно на всех платформах.
static VALUE
pst_wifexited(VALUE st)
{
int status = PST2INT(st);
if (WIFEXITED(status))
return Qtrue;
else
return Qfalse;
} Возвращает true если stat завершился нормально (например, с помощью вызова exit(), или завершил выполнение программы).
static VALUE
pst_wexitstatus(VALUE st)
{
int status = PST2INT(st);
if (WIFEXITED(status))
return INT2NUM(WEXITSTATUS(status));
return Qnil;
} Возвращает наименее значимые восемь битов кода возврата stat. Доступно только если exited? равно true.
fork { } #=> 26572
Process.wait #=> 26572
$?.exited? #=> true
$?.exitstatus #=> 0
fork { exit 99 } #=> 26573
Process.wait #=> 26573
$?.exited? #=> true
$?.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;
} Переопределяет метод инспекции.
system("false")
p $?.inspect #=> "#<Process::Status: pid 12861 exit 1>"
static VALUE
pst_pid_m(VALUE self)
{
rb_pid_t pid = pst_pid(self);
return PIDT2NUM(pid);
} Возвращает идентификатор процесса, который представляет этот объект состояния.
fork { exit } #=> 26569
Process.wait #=> 26569
$?.pid #=> 26569
static VALUE
pst_wifsignaled(VALUE st)
{
int status = PST2INT(st);
if (WIFSIGNALED(status))
return Qtrue;
else
return Qfalse;
} Возвращает true если stat завершился из-за необработанного сигнала.
static VALUE
pst_wifstopped(VALUE st)
{
int status = PST2INT(st);
if (WIFSTOPPED(status))
return Qtrue;
else
return Qfalse;
} Возвращает true если этот процесс приостановлен. Это возвращается только если соответствующий вызов ожидания содержал флаг Process::WUNTRACED.
static VALUE
pst_wstopsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSTOPPED(status))
return INT2NUM(WSTOPSIG(status));
return Qnil;
} Возвращает номер сигнала, который привел к остановке stat (или nil, если само значение не остановлено).
static VALUE
pst_success_p(VALUE st)
{
int status = PST2INT(st);
if (!WIFEXITED(status))
return Qnil;
return WEXITSTATUS(status) == EXIT_SUCCESS ? Qtrue : Qfalse;
} Возвращает true, если stat завершился успешно, false, если нет. Возвращает nil, если exited? не равно true.
static VALUE
pst_wtermsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSIGNALED(status))
return INT2NUM(WTERMSIG(status));
return Qnil;
} Возвращает номер сигнала, который привел к завершению stat (или nil если self не был завершён пойманным сигналом).
static VALUE
pst_to_i(VALUE self)
{
int status = pst_status(self);
return RB_INT2NUM(status);
} Возвращает биты в stat как Integer. Обращение к этим битам зависит от платформы.
fork { exit 0xab } #=> 26566
Process.wait #=> 26566
sprintf('%04x', $?.to_i) #=> "ab00"
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;
} Отображает pid и код завершения в виде строки.
system("false")
p $?.to_s #=> "pid 12766 exit 1"
Ruby Core © 1993–2020 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.