[Ruby 1.9 - Bug #4596][Open] Process.kill doesn't accept pid 0 (win32)

Issue #4596 has been reported by Akio T…


Bug #4596: Process.kill doesn’t accept pid 0 (win32)

Author: Akio T.
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3dev (2011-04-18) [i386-mswin32_100]

MSWin32版Rubyで、Process.killにpidとして0を指定するとEINVALとなります。
この動作は、以下の理由からバグだと思いますが、何か事情があるのでしょうか?
バグと考える理由)

  1. Process.killにpidとして0を指定することは認められている。
    るりま(http://doc.okkez.net/static/192/class/Process.html)でもおそらくAPIの元となったkill(2)でも、pidとして0を指定した場合、カレントプロセスのプロセスグループにシグナルを送るとなっています。

win32/win32.cのkillの実装でSIGINTの送信をエミュレートするために利用しているGenerateConsoleCtrlEventは、pidとして0を指定した場合、MSDNによれば「dwProcessGroupId
パラメータに 0 を指定すると、呼び出し側プロセスのコンソールを共有するすべてのプロセスに信号が送信されます。」と、所定の効果が得られる。

以下がパッチです。

— win32.c~ 2011-04-17 00:02:49.000000000 +0900
+++ win32.c 2011-04-22 20:53:36.000000000 +0900
@@ -3727,7 +3727,7 @@ kill(int pid, int sig)
int ret = 0;
DWORD err;

  • if (pid <= 0) {
  • if (pid < 0) {
    errno = EINVAL;
    return -1;
    }

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

$B%7%s%,%]!<%k$O%M%C%H$,:Y$$5$$,!#(B

In message “Re: [ruby-dev:43421] [Ruby 1.9 - Bug #4596][Open]
Process.kill doesn’t accept pid 0 (win32)”
on Fri, 22 Apr 2011 21:52:22 +0900, Akio T. [email protected]
writes:

|MSWin32$BHG(BRuby$B$G!“(BProcess.kill$B$K(Bpid$B$H$7$F(B0$B$r;XDj$9$k$H(BEINVAL$B$H$J$j$^$9!#(B
|$B$3$NF0:n$O!“0J2<$NM}M3$+$i%P%0$@$H;W$$$^$9$,!“2?$+;v>p$,$”$k$N$G$7$g$&$+!)(B
|$B%P%0$H9M$($kM}M3!K(B
|1. Process.kill$B$K(Bpid$B$H$7$F(B0$B$r;XDj$9$k$3$H$OG’$a$i$l$F$$$k!#(B
|$B$k$j$^!J(Bhttp://doc.okkez.net/static/192/class/Process.html$B!K$G$b$*$=$i$/(BAPI$B$N85$H$J$C$?(Bkill(2)$B$G$b!”(Bpid$B$H$7$F(B0$B$r;XDj$7$?>l9g!”%+%l%s%H%W%m%;%9$N%W%m%;%9%0%k!<%W$K%7%0%J%k$rAw$k$H$J$C$F$$$^$9!#(B
|2.
win32/win32.c$B$N(Bkill$B$N<BAu$G(BSIGINT$B$NAw?.$r%(%_%e%l!<%H$9$k$?$a$KMxMQ$7$F$$$k(BGenerateConsoleCtrlEvent$B$O!“(Bpid$B$H$7$F(B0$B$r;XDj$7$?>l9g!”(BMSDN$B$K$h$l$P!V(BdwProcessGroupId
$B%Q%i%a!<%?$K(B 0
$B$r;XDj$9$k$H!“8F$S=P$7B&%W%m%;%9$N%3%s%=!<%k$r6&M-$9$k$9$Y$F$N%W%m%;%9$K?.9f$,Aw?.$5$l$^$9!#!W$H!”=jDj$N8z2L$,F@$i$l$k!#(B

$B;d$K$OBEEv$@$H;W$($^$9$,!"$&$5$5$s$O$I$&;W$$$^$9$+!)(B

Issue #4596 has been updated by Usaku NAKAMURA.

Category set to core
Status changed from Open to Assigned
Assignee set to Akio T.

とりあえず記憶に何もないので、変えちゃっていいと思います。
artonさんよろしく。

Bug #4596: Process.kill doesn’t accept pid 0 (win32)

Author: Akio T.
Status: Assigned
Priority: Normal
Assignee: Akio T.
Category: core
Target version:
ruby -v: -

MSWin32版Rubyで、Process.killにpidとして0を指定するとEINVALとなります。
この動作は、以下の理由からバグだと思いますが、何か事情があるのでしょうか?
バグと考える理由)

  1. Process.killにpidとして0を指定することは認められている。
    るりま(http://doc.okkez.net/static/192/class/Process.html)でもおそらくAPIの元となったkill(2)でも、pidとして0を指定した場合、カレントプロセスのプロセスグループにシグナルを送るとなっています。

win32/win32.cのkillの実装でSIGINTの送信をエミュレートするために利用しているGenerateConsoleCtrlEventは、pidとして0を指定した場合、MSDNによれば「dwProcessGroupId
パラメータに 0 を指定すると、呼び出し側プロセスのコンソールを共有するすべてのプロセスに信号が送信されます。」と、所定の効果が得られる。

以下がパッチです。

— win32.c~ 2011-04-17 00:02:49.000000000 +0900
+++ win32.c 2011-04-22 20:53:36.000000000 +0900
@@ -3727,7 +3727,7 @@ kill(int pid, int sig)
int ret = 0;
DWORD err;

  • if (pid <= 0) {
  • if (pid < 0) {
    errno = EINVAL;
    return -1;
    }

Issue #4596 has been updated by Akio T…

Status changed from Closed to Open

:KILLを与えた場合に、WindowsでのエミュレーションではESRCH(No Such process)になることを考慮していなかった。
0を認めるのは、:INTに限定するように修正が必要。

Bug #4596: Process.kill doesn’t accept pid 0 (win32)

Author: Akio T.
Status: Open
Priority: Normal
Assignee: Akio T.
Category: core
Target version:
ruby -v: -

MSWin32版Rubyで、Process.killにpidとして0を指定するとEINVALとなります。
この動作は、以下の理由からバグだと思いますが、何か事情があるのでしょうか?
バグと考える理由)

  1. Process.killにpidとして0を指定することは認められている。
    るりま(http://doc.okkez.net/static/192/class/Process.html)でもおそらくAPIの元となったkill(2)でも、pidとして0を指定した場合、カレントプロセスのプロセスグループにシグナルを送るとなっています。

win32/win32.cのkillの実装でSIGINTの送信をエミュレートするために利用しているGenerateConsoleCtrlEventは、pidとして0を指定した場合、MSDNによれば「dwProcessGroupId
パラメータに 0 を指定すると、呼び出し側プロセスのコンソールを共有するすべてのプロセスに信号が送信されます。」と、所定の効果が得られる。

以下がパッチです。

— win32.c~ 2011-04-17 00:02:49.000000000 +0900
+++ win32.c 2011-04-22 20:53:36.000000000 +0900
@@ -3727,7 +3727,7 @@ kill(int pid, int sig)
int ret = 0;
DWORD err;

  • if (pid <= 0) {
  • if (pid < 0) {
    errno = EINVAL;
    return -1;
    }

Issue #4596 has been updated by Akio T…

Status changed from Open to Closed
Target version set to 1.9.3


Bug #4596: Process.kill doesn’t accept pid 0 (win32)

Author: Akio T.
Status: Closed
Priority: Normal
Assignee: Akio T.
Category: core
Target version: 1.9.3
ruby -v: -

MSWin32版Rubyで、Process.killにpidとして0を指定するとEINVALとなります。
この動作は、以下の理由からバグだと思いますが、何か事情があるのでしょうか?
バグと考える理由)

  1. Process.killにpidとして0を指定することは認められている。
    るりま(http://doc.okkez.net/static/192/class/Process.html)でもおそらくAPIの元となったkill(2)でも、pidとして0を指定した場合、カレントプロセスのプロセスグループにシグナルを送るとなっています。

win32/win32.cのkillの実装でSIGINTの送信をエミュレートするために利用しているGenerateConsoleCtrlEventは、pidとして0を指定した場合、MSDNによれば「dwProcessGroupId
パラメータに 0 を指定すると、呼び出し側プロセスのコンソールを共有するすべてのプロセスに信号が送信されます。」と、所定の効果が得られる。

以下がパッチです。

— win32.c~ 2011-04-17 00:02:49.000000000 +0900
+++ win32.c 2011-04-22 20:53:36.000000000 +0900
@@ -3727,7 +3727,7 @@ kill(int pid, int sig)
int ret = 0;
DWORD err;

  • if (pid <= 0) {
  • if (pid < 0) {
    errno = EINVAL;
    return -1;
    }