現在 Process::Status#to_s は整数な文字列を返します。

% ./ruby -e 'system("exit 1;"); p $?.to_s'
"256"

これはわかりにくいので以下のような文字列を返すのはどうでしょ
うか。

% ./ruby -e 'system("exit 1;"); p $?.to_s'
"pid 21978 exit 1"

signal で死んだ場合:
% ./ruby -e 'system("kill -ILL $$"); puts $?'
pid 7666 SIGILL (signal 4) (core dumped)

signal で止まった場合:
% ./ruby -e 'pid = spawn("kill -TSTP $$"); Process.waitpid pid, Process::WUNTRACED; puts $?'
pid 22014 stopped SIGTSTP (signal 20)

なお、メッセージの生成コードは inspect と共有しており、
inspect の結果も上記の形式を #<Process::Status: ...> で括っ
たものになります。

% ./ruby -e 'system("true"); p $?'
#<Process::Status: pid 7695 exit 0>

Index: process.c
===================================================================
--- process.c	(リビジョン 13695)
+++ process.c	(作業コピー)
@@ -248,20 +248,6 @@
 
 /*
  *  call-seq:
- *     stat.to_s   => string
- *
- *  Equivalent to _stat_<code>.to_i.to_s</code>.
- */
-
-static VALUE
-pst_to_s(VALUE st)
-{
-    return rb_fix2str(pst_to_i(st), 10);
-}
-
-
-/*
- *  call-seq:
  *     stat.pid   => fixnum
  *
  *  Returns the process ID that this status object represents.
@@ -277,34 +263,20 @@
     return rb_iv_get(st, "pid");
 }
 
-
-/*
- *  call-seq:
- *     stat.inspect   => string
- *
- *  Override the inspection method.
- */
-
-static VALUE
-pst_inspect(VALUE st)
+static void
+pst_message(VALUE str, rb_pid_t pid, int status)
 {
-    VALUE pid;
-    int status;
-    VALUE str;
     char buf[256];
-
-    pid = pst_pid(st);
-    status = NUM2INT(st);
-
-    str = rb_sprintf("#<%s: pid=%ld", rb_class2name(CLASS_OF(st)), NUM2LONG(pid));
+    snprintf(buf, sizeof(buf), "pid %ld", (long)pid);
+    rb_str_cat2(str, buf);
     if (WIFSTOPPED(status)) {
 	int stopsig = WSTOPSIG(status);
 	const char *signame = ruby_signal_name(stopsig);
 	if (signame) {
-	    snprintf(buf, sizeof(buf), ",stopped(SIG%s=%d)", signame, stopsig);
+	    snprintf(buf, sizeof(buf), " stopped SIG%s (signal %d)", signame, stopsig);
 	}
 	else {
-	    snprintf(buf, sizeof(buf), ",stopped(%d)", stopsig);
+	    snprintf(buf, sizeof(buf), " stopped signal %d", stopsig);
 	}
 	rb_str_cat2(str, buf);
     }
@@ -312,22 +284,67 @@
 	int termsig = WTERMSIG(status);
 	const char *signame = ruby_signal_name(termsig);
 	if (signame) {
-	    snprintf(buf, sizeof(buf), ",signaled(SIG%s=%d)", signame, termsig);
+	    snprintf(buf, sizeof(buf), " SIG%s (signal %d)", signame, termsig);
 	}
 	else {
-	    snprintf(buf, sizeof(buf), ",signaled(%d)", termsig);
+	    snprintf(buf, sizeof(buf), " signal %d", termsig);
 	}
 	rb_str_cat2(str, buf);
     }
     if (WIFEXITED(status)) {
-	snprintf(buf, sizeof(buf), ",exited(%d)", WEXITSTATUS(status));
+	snprintf(buf, sizeof(buf), " exit %d", WEXITSTATUS(status));
 	rb_str_cat2(str, buf);
     }
 #ifdef WCOREDUMP
     if (WCOREDUMP(status)) {
-	rb_str_cat2(str, ",coredumped");
+	rb_str_cat2(str, " (core dumped)");
     }
 #endif
+}
+
+
+/*
+ *  call-seq:
+ *     stat.to_s   => string
+ *
+ *  Show pid and exit status as a string.
+ */
+
+static VALUE
+pst_to_s(VALUE st)
+{
+    rb_pid_t pid;
+    int status;
+    VALUE str;
+
+    pid = NUM2LONG(pst_pid(st));
+    status = NUM2INT(st);
+
+    str = rb_str_buf_new(0);
+    pst_message(str, pid, status);
+    return str;
+}
+
+
+/*
+ *  call-seq:
+ *     stat.inspect   => string
+ *
+ *  Override the inspection method.
+ */
+
+static VALUE
+pst_inspect(VALUE st)
+{
+    rb_pid_t pid;
+    int status;
+    VALUE str;
+
+    pid = NUM2LONG(pst_pid(st));
+    status = NUM2INT(st);
+
+    str = rb_sprintf("#<%s: ", rb_class2name(CLASS_OF(st)));
+    pst_message(str, pid, status);
     rb_str_cat2(str, ">");
     return str;
 }
-- 
[田中 哲][たなか あきら][Tanaka Akira]