当前位置:  开发笔记 > 后端 > 正文

使CreateProcess继承调用进程的控制台

如何解决《使CreateProcess继承调用进程的控制台》经验,为你挑选了1个好方法。

当我在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的代码,他们从不首先设置这个标志.)

希望这可能对那些偶然发现这个线程的人有所帮助,比如我自己.



1> 小智..:

我知道,这个线程相当陈旧,但是,我遇到了同样的问题.

就像TS一样,控制台句柄在Cygwin下继承并正常工作,但在Windows控制台上却没有.相反,stdout上的输出既未显示,也未报告任何错误.继承的管道工作仍然很好.

我花了一些时间来确定(现在很明显的)问题:使用CREATE_NO_WINDOW调用CreateProcess().删除此标志,控制台输出就可以了.(虽然,根据TS的代码,他们从不首先设置这个标志.)

希望这可能对那些偶然发现这个线程的人有所帮助,比如我自己.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有