Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Windows中临时捕获控制台应用程序的标准输出_C_Winapi - Fatal编程技术网

C 在Windows中临时捕获控制台应用程序的标准输出

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

是否可以(如果可以,如何)将stdout(以及可选的stderr)临时重定向到一个文件,然后恢复原始的stdout

在POSIX环境中,我使用
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似乎有一个简单的解决方案。嗯,实际上这对于程序的不同部分来说是很棒的,谢谢!