WindowsでCreateProcessを呼び出すと、新しいプロセスが呼び出し元のプロセスのコンソールを継承していないようです。「rubyxtest」を実行するテストプログラムを作成しました。xtestは「hello」を標準出力に書き込むスクリプトです。このテストプログラムをEmacsから実行しましたが、出力がありません。GetStdHandleを呼び出す次のコードも試しましたが、出力がありません。次に、dwCreationFlagsのCREATE_NEW_CONSOLEをCreateProcessに渡してみました。これにより、Ruby出力でまったく新しいウィンドウが作成されました。最後に、単純なfork / execテストプログラムを作成し、CygwinのGCCを使用してコンパイルしました。このプログラムは機能しました:Rubyの出力は期待通りにEmacsに現れました。http://cygwin.com/cgi-bin/cvsweb.cgi/src/winsup/cygwin/spawn.cc?rev=1.268&content-type=text/x-cvsweb-markup&でCygwinソースコードを解読しようとしましたしかし失敗しました。では、子からの出力が期待どおりに表示されるように、新しいプロセスに親プロセスのコンソールを継承させるにはどうすればよいでしょうか。
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
if(!CreateProcess(0, "ruby xtest", 0, 0, 1, 0, 0, 0, &si, &pi)) die("CreateProcess");