著作一覧 |
spawnした子プロセスを殺したい。
後先考えなければ次のようにすれば良い。
pid = spawn('command') Process.kill :KILL, pid
だが、コンソール待ちをしているとかいろいろ理由があって、SIGKILLではなく、SIGINTを送りたい。
Process.kill :INT, pid
だが、これはまったく効かない。おかしいなと思って、win32\win32.cを眺めると、
case SIGINT: RUBY_CRITICAL({ if (!GenerateConsoleCtrlEvent(CTRL_C_EVENT, (DWORD)pid)) {となっている。
とか書いているうちにバグを見つけてしまった。
るりまには、「0の場合はカレントプロセス……」とあるし
MSDNには、「パラメータに0を指定すると、……」とある。
しかし、win32/win32.cでは
if (pid <= 0) { errno = EINVAL; return -1; }
と、0を認めない。これ、単なるバグなのか恐るべき意図(Windows95ではどうとかを回避とか)があるのかどっちなんだろう。
ジェズイットを見習え |