无法在管道 Windows Visual cpp 上写入
我创建了两个管道将子进程 stdin 和 stdout 重定向到父进程,如下所示 http://msdn.microsoft.com/en- us/library/ms682499%28VS.85%29.aspx
子进程是一个exe文件。 当使用控制台执行时,它首先在 STDOUT 上返回警告,然后要求来自 STDIN 的是/否输入。 当我从我的 cpp 程序运行子进程时,读取管道成功地从子进程 STDOUT 读取警告行,但是当尝试使用写入管道将“是”或“否”发送到子进程的 STDIN 时,子程序不知何故没有收到它。但是,当我在父进程的 STDIN 上键入它时,子进程会收到 yes 和 no 。
知道为什么会发生这种情况吗?
I created two pipe to redirect child process stdin and stdout to parent process as given in
http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx
The child process is an exe file.
when executed using console it first returns a warning on STDOUT and then asks for a yes/no input from STDIN.
when i am running the child process from my cpp program, the read pipe successfully reads the warning line from childs STDOUT but when try to send "yes" or "no" to child's STDIN using the write pipe the child program somehow does not receive it. however when i type it on the STDIN of parent the child process receives the yes and no .
Any idea why this is happening ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有儿童节目的资源吗?检查它如何读取输入(或在此处发布源代码)。
您的子程序是否可以使用 cmd 输入重定向,例如,如果您执行
echo yes |子程序.exe?
如果没有,则该程序可能使用低级别 控制台函数 进行输入(可能是间接的,例如通过
_getch()
)。在这种情况下,您可能必须使用 WriteConsoleInput 模拟输入。或者,您的重定向代码可能有错误。发布在这里。
编辑使用WriteConsoleInput的示例:
上面的示例必须编译为控制台程序,因为它使用
GetStdHandle
来获取控制台输入句柄。当父级是控制台应用程序时,子控制台应用程序将与父级共享控制台。如果父级是 GUI 应用程序,因此没有控制台,请使用 AttachConsole 函数在调用GetStdHandle
之前附加到子进程控制台,然后调用 FreeConsole 完成后。Do you have sources of the child program? Check how it reads its input (or post the source here).
Does your child program work with cmd input redirection, e.g. if you do
echo yes | childprogram.exe
?If not, chances are that the program uses low level console functions to do its input (maybe indirectly, e.g. via
_getch()
). In this case you may have to use WriteConsoleInput to simulate input.Or, there may be a mistake in your redirection code. Post it here.
EDIT A sample of using WriteConsoleInput:
The sample above has to be compiled as a console program, because it uses
GetStdHandle
to obtain console input handle. When parent is a console app, child console app will share the console with parent. If parent is a GUI app and thus has no console, use AttachConsole function to attach to the child process console before callingGetStdHandle
, then call FreeConsole when finished with it.