класс 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-битное значение.
Публичные методы экземпляра
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 vpid, str;
vpid = pst_pid(st);
if (NIL_P(vpid)) {
return rb_sprintf("#<%s: uninitialized>", rb_class2name(CLASS_OF(st)));
}
pid = NUM2PIDT(vpid);
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(VALUE st)
{
return rb_attr_get(st, id_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, если этот процесс остановлен. Это возвращается только в том случае, если соответствующий вызов wait имел установленный флаг WUNTRACED.
static VALUE
pst_wstopsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSTOPPED(status))
return INT2NUM(WSTOPSIG(status));
return Qnil;
} Возвращает номер сигнала, который привел к остановке stat (или nil, если self не остановлен).
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 st)
{
return rb_ivar_get(st, id_status);
} Возвращает биты в stat как Fixnum. Обращение к этим битам зависит от платформы.
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 = NUM2PIDT(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–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.