C 在Windows中临时捕获控制台应用程序的标准输出
是否可以(如果可以,如何)将stdout(以及可选的stderr)临时重定向到一个文件,然后恢复原始的stdout 在POSIX环境中,我使用C 在Windows中临时捕获控制台应用程序的标准输出,c,winapi,C,Winapi,是否可以(如果可以,如何)将stdout(以及可选的stderr)临时重定向到一个文件,然后恢复原始的stdout 在POSIX环境中,我使用dup和dup2来存储和替换STDOUT\u FILENOfreopen不是一个好的解决方案,因为stdout无法通过这种方式恢复 是否可以使用Windows API执行此操作?我相信可以使用POSIX类函数\u DUP和\u DUP2。有没有不涉及他们的解决方案?在Windows上,保留文件名“CON”表示控制台输出流。要在Windows上恢复正常的ST
dup
和dup2
来存储和替换STDOUT\u FILENO
freopen
不是一个好的解决方案,因为stdout
无法通过这种方式恢复
是否可以使用Windows API执行此操作?我相信可以使用POSIX类函数
\u DUP
和\u DUP2
。有没有不涉及他们的解决方案?在Windows上,保留文件名“CON”表示控制台输出流。要在Windows上恢复正常的STDOUT行为,只需调用
freopen("CON","w",stdout);
看看Win32 API。此外,您还可以使用
编辑
请参阅以下StackOverflow帖子
如果此进程作为子进程运行,并且应该捕获其标准输出,该怎么办?CON是否指向重定向的标准输出?否。这将始终将其重新路由到控制台I/O流。我将尝试用谷歌搜索一个保留原始标准输出的方法。你为什么想要一个特定于Windows API的解决方案<代码>\u dup(),
\u dup2()
,和\u fileno()
工作很好这个答案应该固定在stackoverflow上,我搜索了大约4个小时,尝试了很多方法这是唯一提到的一个骗局!谢谢SetStdHandle的问题在于,它以与freopen()
不同的级别重新路由输出,因此不会还原更改。一些额外的搜索使我找到了\u get\u osfhandle(\u fileno(filestream))
,它将句柄返回到文件流,然后可以在SetTDHandle()
中使用。对我来说,这似乎是一个只使用windows特定功能的可行解决方案;)如果你只是想要一个子进程的stdout,那么windows上的CRT似乎有一个简单的解决方案。嗯,实际上这对于程序的不同部分来说是很棒的,谢谢!