windows - 让CreateProcess继承调用进程的控制台

标签 windows console createprocess

当我在 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&cvsroot=src 中的 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");

最佳答案

我知道,这个帖子很旧,但是,我遇到了同样的问题。

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

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

希望这可能对像我一样偶然发现此线程的人有所帮助。

关于windows - 让CreateProcess继承调用进程的控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/340356/

相关文章:

Java-如何修复 Spring 框架中的异常?

c++ - i686-elf-gcc CreateProcess 错误(没有那个文件或目录)

java - 使用 CreateProcess 从 Win32 C++ 应用程序启动 Java 应用程序时出错

c++ - 如何阻止函数在 MS VS C++ 中导出?

python - 发布一个最小环境的Python程序

c++ - GetModuleFileNameA 返回奇怪的结果

mysql - 将 WordPress 从 Linux 迁移到 Windows Server 2012 - 数据库问题

C++ - 保持控制台窗口打开?

c++ - 检查窗口是否处于事件状态

创建隐藏进程(窗口不可见)