当我在Windows中调用CreateProcess时,新进程似乎不会继承调用进程的控制台.我制作了一个运行"ruby xtest"的测试程序,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");
小智.. 6
我知道,这个线程相当陈旧,但是,我遇到了同样的问题.
就像TS一样,控制台句柄在Cygwin下继承并正常工作,但在Windows控制台上却没有.相反,stdout上的输出既未显示,也未报告任何错误.继承的管道工作仍然很好.
我花了一些时间来确定(现在很明显的)问题:使用CREATE_NO_WINDOW调用CreateProcess().删除此标志,控制台输出就可以了.(虽然,根据TS的代码,他们从不首先设置这个标志.)
希望这可能对那些偶然发现这个线程的人有所帮助,比如我自己.
我知道,这个线程相当陈旧,但是,我遇到了同样的问题.
就像TS一样,控制台句柄在Cygwin下继承并正常工作,但在Windows控制台上却没有.相反,stdout上的输出既未显示,也未报告任何错误.继承的管道工作仍然很好.
我花了一些时间来确定(现在很明显的)问题:使用CREATE_NO_WINDOW调用CreateProcess().删除此标志,控制台输出就可以了.(虽然,根据TS的代码,他们从不首先设置这个标志.)
希望这可能对那些偶然发现这个线程的人有所帮助,比如我自己.