From: Tomoyuki Chikanaga Date: 2011-05-11T22:07:07+09:00 Subject: [ruby-dev:43524] [Ruby 1.9 - Feature #4362] Process.kill should accept -SIGXXX with implicit conversion Issue #4362 has been updated by Tomoyuki Chikanaga. この Process.kill の引数の処理についてですが、 引数に受け付けるものが増えるだけで困ることはあまりないでしょうし、 もうしばらく待って反対意見がなければ入れてしまおうと思います。 ---------------------------------------- Feature #4362: Process.kill should accept -SIGXXX with implicit conversion http://redmine.ruby-lang.org/issues/4362 Author: Tomoyuki Chikanaga Status: Open Priority: Normal Assignee: Category: Target version: 1.9.3 ruby -v: ruby 1.9.3dev (2011-02-02 trunk 30762) [x86_64-darwin10.6.0] =begin Process.kill の第一引数は Fixnum か Symbol、String でシグナルの種類を指定し、 文字列の時は先頭に - をつけることでプロセスグループへシグナル送信するようになっています。 実際には Fixnum, Symbol, String 以外のオブジェクトを渡すと to_str で文字列への 暗黙の変換が行なわれるようになっているのですが、この時に先頭の - を認識しません。 またシンボルの時も先頭の - が解釈されません。 > Process.kill(:"-SIGTERM", $$) ArgumentError: unsupported name `SIG-SIGTERM' > Process.kill(:"-TERM", $$) ArgumentError: unsupported name `SIG-TERM' マニュアルには特に String 以外の時のことは書かれていませんが、Symbol や暗黙の変換が行なわれた時にも 先頭の - が解釈されるようにしたほうが良いのではないかと思うのですがいかがでしょうか? diff --git a/signal.c b/signal.c index 27d90ac..5343108 100644 --- a/signal.c +++ b/signal.c @@ -359,6 +359,7 @@ rb_f_kill(int argc, VALUE *argv) int negative = 0; int sig; int i; + volatile VALUE str; const char *s; rb_secure(2); @@ -376,11 +377,11 @@ rb_f_kill(int argc, VALUE *argv) case T_STRING: s = RSTRING_PTR(argv[0]); + str_signal: if (s[0] == '-') { negative++; s++; } - str_signal: if (strncmp("SIG", s, 3) == 0) s += 3; if((sig = signm2signo(s)) == 0) @@ -391,9 +392,6 @@ rb_f_kill(int argc, VALUE *argv) break; default: - { - VALUE str; - str = rb_check_string_type(argv[0]); if (!NIL_P(str)) { s = RSTRING_PTR(str); @@ -401,7 +399,6 @@ rb_f_kill(int argc, VALUE *argv) } rb_raise(rb_eArgError, "bad signal type %s", rb_obj_classname(argv[0])); - } break; } =end -- http://redmine.ruby-lang.org