From: KANEKO Naoshi Date: 1999-12-23T00:19:00+09:00 Subject: [ruby-dev:8702] Re: [mswin32] STDERR does not work during `_function. 金子です。 In message "[ruby-dev:8665] [mswin32] STDERR does not work during `_function." on Wed, 15 Dec 1999 21:09:54 +0900, "NAKAMURA, Hiroshi" writes: >なひです. > >mswin版のRubyで「`」でコマンドを実行した際, >標準エラーへの出力がどこかへ消えてしまうようです. >報告だけですいません... プロセスを起動するとき、標準エラーハンドルが正しくセットされて いなかったようです。 入力をパイプにつなげる場合のハンドルも間違っていました。 ついでに余分と思われた DuplicateHandle() もまとめて消してしまい ましたが、どうでしょうか。これも深い意味があったりして。 ...だんだん自信がなくなってきました。 一応、NT4.0 では動くことを確認しました。 ただし、Win98 ではプロセス呼び出しのあたりはいろいろおかしくて (今回の修正とは関係なく)テストしてると簡単にアプリケーション エラーになります。 こんなのとか。 f = open("|./cat.exe", "w") f.puts("hello") f.close もう少し調べてみる必要がありそうですね。 =============================================================== diff -u -p win32/win32.c.orig win32/win32.c --- win32/win32.c.orig Sun Dec 19 22:46:25 1999 +++ win32/win32.c Tue Dec 21 00:36:49 1999 @@ -495,7 +495,7 @@ mypopen (char *cmd, char *mode) int p[2]; BOOL fRet; - HANDLE hInFile, hOutFile, hStdin, hStdout; + HANDLE hInFile, hOutFile; LPCSTR lpApplicationName = NULL; LPTSTR lpCommandLine; LPTSTR lpCmd2 = NULL; @@ -533,35 +533,14 @@ mypopen (char *cmd, char *mode) aStartupInfo.dwFlags = STARTF_USESTDHANDLES; if (reading) { - aStartupInfo.hStdInput = GetStdHandle(STD_OUTPUT_HANDLE);//hStdin; - aStartupInfo.hStdError = INVALID_HANDLE_VALUE; - //for save - DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE), - GetCurrentProcess(), &hStdout, - 0, FALSE, DUPLICATE_SAME_ACCESS - ); - //for redirect - DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE), - GetCurrentProcess(), &hStdin, - 0, TRUE, DUPLICATE_SAME_ACCESS - ); + aStartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); aStartupInfo.hStdOutput = hOutFile; } else { - aStartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); //hStdout; - aStartupInfo.hStdError = INVALID_HANDLE_VALUE; - // for save - DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE), - GetCurrentProcess(), &hStdin, - 0, FALSE, DUPLICATE_SAME_ACCESS - ); - //for redirect - DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE), - GetCurrentProcess(), &hStdout, - 0, TRUE, DUPLICATE_SAME_ACCESS - ); - aStartupInfo.hStdInput = hInFile; + aStartupInfo.hStdInput = hInFile; + aStartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); } + aStartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); dwCreationFlags = (NORMAL_PRIORITY_CLASS); @@ -587,24 +566,12 @@ mypopen (char *cmd, char *mode) CloseHandle(aProcessInformation.hThread); if (reading) { - HANDLE hDummy; - fd = _open_osfhandle((long)hInFile, (_O_RDONLY | pipemode)); CloseHandle(hOutFile); - DuplicateHandle(GetCurrentProcess(), hStdout, - GetCurrentProcess(), &hDummy, - 0, TRUE, (DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE) - ); } else { - HANDLE hDummy; - fd = _open_osfhandle((long)hOutFile, (_O_WRONLY | pipemode)); CloseHandle(hInFile); - DuplicateHandle(GetCurrentProcess(), hStdin, - GetCurrentProcess(), &hDummy, - 0, TRUE, (DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE) - ); } if (fd == -1) =============================================================== -- 金子 尚史 (KANEKO Naoshi) e-mail: wbs01621@mail.wbs.ne.jp