From: nobu.nakada@... Date: 2002-08-24T23:54:10+09:00 Subject: [ruby-dev:18076] Win32 signal, process etc なかだです。 win32/win32.c:kill()でSIGINTとSIGKILLだけ処理していますが、 signal.cではSIGKILLが定義されていないため、実際には即値で指定し ないと使えません。win32.cのSIGKILLの定義をsignal.cにもコピーす るか、win32.hでsignal.hもインクルードしてそっちに持っていくかす る必要があると思います。あるいは、SIGTERMはあるようなのでこれも SIGKILLと同じ処理にするとか。 また、CreateChild()ではWin9xの場合にpidの符号を反転してますが、 kill()ではSIGINTの場合にそれを戻していません。 もうひとつ、pipe_exec()では一旦stdin/stdoutにdupしてから CreateProcess()してますが、なんとなくこれはCreateChild()と機能 的に重複してるような気がします。 あとbccに関してですが、rb_w32_fddup()とrb_w32_accept()で rb_w32_open_osfhandle()を使ってるのは、open_osfhandle()でなくて いいんでしょうか。 とりあえずkill()のパッチ。 Index: win32/win32.c =================================================================== RCS file: /cvs/ruby/src/ruby/win32/win32.c,v retrieving revision 1.63 diff -u -2 -p -r1.63 win32.c --- win32/win32.c 20 Aug 2002 13:03:22 -0000 1.63 +++ win32/win32.c 24 Aug 2002 14:43:08 -0000 @@ -2345,21 +2345,29 @@ kill(int pid, int sig) int ret = 0; + if (pid <= 0) { + errno = EINVAL; + return -1; + } + + if (IsWin95()) pid = -pid; if ((unsigned int)pid == GetCurrentProcessId() && sig != SIGKILL) return raise(sig); - if (sig == SIGINT && pid > 0) { + switch (sig) { + case SIGINT: RUBY_CRITICAL({ if (!GenerateConsoleCtrlEvent(CTRL_C_EVENT, (DWORD)pid)) { - errno = GetLastError(); + if ((errno = GetLastError()) == 0) { + errno = EPERM; + } ret = -1; } }); - } - else if (sig == SIGKILL && pid > 0) { - HANDLE hProc; + break; + case SIGKILL: + case SIGTERM: RUBY_CRITICAL({ - hProc = OpenProcess(PROCESS_TERMINATE, FALSE, - IsWin95() ? -pid : pid); + HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, (DWORD)pid); if (hProc == NULL || hProc == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_INVALID_PARAMETER) { @@ -2377,8 +2385,10 @@ kill(int pid, int sig) CloseHandle(hProc); }); - } - else { + break; + + define: errno = EINVAL; ret = -1; + break; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦