Class: Process::Status
Overview
*******************************************************************
Process::Status encapsulates the information on the
status of a running or terminated system process. The built-in
variable <code>$?</code> is either +nil+ or a
Process::Status object.
fork { exit 99 } #=> 26557
Process.wait #=> 26557
$?.class #=> Process::Status
$?.to_i #=> 25344
$? >> 8 #=> 99
$?.stopped? #=> false
$?.exited? #=> true
$?.exitstatus #=> 99
Posix systems record information on processes using a 16-bit
integer. The lower bits record the process status (stopped,
exited, signaled) and the upper bits possibly contain additional
information (for example the program's return code in the case of
exited processes). Pre Ruby 1.8, these bits were exposed directly
to the Ruby program. Ruby now encapsulates these in a
Process::Status object. To maximize compatibility,
however, these objects retain a bit-oriented interface. In the
descriptions that follow, when we talk about the integer value of
_stat_, we're referring to this 16 bit value.
Instance Method Summary collapse
-
#&(num) ⇒ Integer
Logical AND of the bits in stat with num.
-
#==(other) ⇒ Boolean
Returns
true
if the integer value of stat equals other. -
#>>(num) ⇒ Integer
Shift the bits in stat right num places.
-
#coredump? ⇒ Boolean
Returns
true
if stat generated a coredump when it terminated. -
#exited? ⇒ Boolean
Returns
true
if stat exited normally (for example using anexit()
call or finishing the program). -
#exitstatus ⇒ Integer?
Returns the least significant eight bits of the return code of stat.
-
#inspect ⇒ String
Override the inspection method.
-
#pid ⇒ Integer
Returns the process ID that this status object represents.
-
#signaled? ⇒ Boolean
Returns
true
if stat terminated because of an uncaught signal. -
#stopped? ⇒ Boolean
Returns
true
if this process is stopped. -
#stopsig ⇒ Integer?
Returns the number of the signal that caused stat to stop (or
nil
if self is not stopped). -
#success? ⇒ true, ...
Returns
true
if stat is successful,false
if not. -
#termsig ⇒ Integer?
Returns the number of the signal that caused stat to terminate (or
nil
if self was not terminated by an uncaught signal). -
#to_i ⇒ Integer
Returns the bits in stat as a Integer.
-
#to_s ⇒ String
Show pid and exit status as a string.
Instance Method Details
#&(num) ⇒ Integer
749 750 751 752 753 754 755 |
# File 'process.c', line 749
static VALUE
pst_bitand(VALUE st1, VALUE st2)
{
int status = PST2INT(st1) & NUM2INT(st2);
return INT2NUM(status);
}
|
#==(other) ⇒ Boolean
Returns true
if the integer value of stat equals other.
729 730 731 732 733 734 |
# File 'process.c', line 729
static VALUE
pst_equal(VALUE st1, VALUE st2)
{
if (st1 == st2) return Qtrue;
return rb_equal(pst_to_i(st1), st2);
}
|
#>>(num) ⇒ Integer
770 771 772 773 774 775 776 |
# File 'process.c', line 770
static VALUE
pst_rshift(VALUE st1, VALUE st2)
{
int status = PST2INT(st1) >> NUM2INT(st2);
return INT2NUM(status);
}
|
#coredump? ⇒ Boolean
Returns true
if stat generated a coredump when it terminated. Not available on all platforms.
936 937 938 939 940 941 942 943 944 945 946 947 948 949 |
# File 'process.c', line 936
static VALUE
pst_wcoredump(VALUE st)
{
#ifdef WCOREDUMP
int status = PST2INT(st);
if (WCOREDUMP(status))
return Qtrue;
else
return Qfalse;
#else
return Qfalse;
#endif
}
|
#exited? ⇒ Boolean
Returns true
if stat exited normally (for example using an exit()
call or finishing the program).
868 869 870 871 872 873 874 875 876 877 |
# File 'process.c', line 868
static VALUE
pst_wifexited(VALUE st)
{
int status = PST2INT(st);
if (WIFEXITED(status))
return Qtrue;
else
return Qfalse;
}
|
#exitstatus ⇒ Integer?
898 899 900 901 902 903 904 905 906 |
# File 'process.c', line 898
static VALUE
pst_wexitstatus(VALUE st)
{
int status = PST2INT(st);
if (WIFEXITED(status))
return INT2NUM(WEXITSTATUS(status));
return Qnil;
}
|
#inspect ⇒ String
Override the inspection method.
system("false")
p $?.inspect #=> "#<Process::Status: pid 12861 exit 1>"
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 |
# File 'process.c', line 700
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;
}
|
#pid ⇒ Integer
612 613 614 615 616 |
# File 'process.c', line 612
static VALUE
pst_pid(VALUE st)
{
return rb_attr_get(st, id_pid);
}
|
#signaled? ⇒ Boolean
Returns true
if stat terminated because of an uncaught signal.
827 828 829 830 831 832 833 834 835 836 |
# File 'process.c', line 827
static VALUE
pst_wifsignaled(VALUE st)
{
int status = PST2INT(st);
if (WIFSIGNALED(status))
return Qtrue;
else
return Qfalse;
}
|
#stopped? ⇒ Boolean
Returns true
if this process is stopped. This is only returned if the corresponding #wait call had the Process::WUNTRACED flag set.
788 789 790 791 792 793 794 795 796 797 |
# File 'process.c', line 788
static VALUE
pst_wifstopped(VALUE st)
{
int status = PST2INT(st);
if (WIFSTOPPED(status))
return Qtrue;
else
return Qfalse;
}
|
#stopsig ⇒ Integer?
Returns the number of the signal that caused stat to stop (or nil
if self is not stopped).
808 809 810 811 812 813 814 815 816 |
# File 'process.c', line 808
static VALUE
pst_wstopsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSTOPPED(status))
return INT2NUM(WSTOPSIG(status));
return Qnil;
}
|
#success? ⇒ true, ...
Returns true
if stat is successful, false
if not. Returns nil
if #exited? is not true
.
917 918 919 920 921 922 923 924 925 |
# File 'process.c', line 917
static VALUE
pst_success_p(VALUE st)
{
int status = PST2INT(st);
if (!WIFEXITED(status))
return Qnil;
return WEXITSTATUS(status) == EXIT_SUCCESS ? Qtrue : Qfalse;
}
|
#termsig ⇒ Integer?
Returns the number of the signal that caused stat to terminate (or nil
if self was not terminated by an uncaught signal).
848 849 850 851 852 853 854 855 856 |
# File 'process.c', line 848
static VALUE
pst_wtermsig(VALUE st)
{
int status = PST2INT(st);
if (WIFSIGNALED(status))
return INT2NUM(WTERMSIG(status));
return Qnil;
}
|
#to_i ⇒ Integer
593 594 595 596 597 |
# File 'process.c', line 593
static VALUE
pst_to_i(VALUE st)
{
return rb_ivar_get(st, id_status);
}
|
#to_s ⇒ String
Show pid and exit status as a string.
system("false")
p $?.to_s #=> "pid 12766 exit 1"
673 674 675 676 677 678 679 680 681 682 683 684 685 686 |
# File 'process.c', line 673
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;
}
|