目标
接管stdout输出,重定向到指定管道,不需要的时候则恢复。
原理
创建管道,通过微软的dup保存默认stdout,_dup2接口重定向,再通过_dup2恢复回来。
代码
参考以下代码。
int hStdOut;
int hStdOutPipe[2];
if (_pipe(hStdOutPipe, OUT_BUFF_SIZE, O_BINARY | O_NOINHERIT) == -1)
return -1;
hStdOut = _dup(_fileno(stdout)); // 备份默认stdout
if (_dup2(hStdOutPipe[WRITE_HANDLE], _fileno(stdout)) != 0)
return -2;
_close(hStdOutPipe[WRITE_HANDLE]);
printf("test"); // 重定向后,测试一下输出
fflush(stdout);
// 恢复默认stdout:
if (_dup2(hStdOut, _fileno(stdout)) != 0)
return 3;
_close(hStdOut);
printf("123"); // 恢复后,再测试
fflush(stdout);
// 测试一下接管期间管道拿到的stdout的数据
char szBuffer[OUT_BUFF_SIZE];
for (;;) {
int nOutRead = _read(hStdOutPipe[READ_HANDLE], szBuffer, OUT_BUFF_SIZE);
if (nOutRead) {
....
} else
break;
}
_close(hStdOutPipe[READ_HANDLE]);
结束。
有任何问题请加入qq群:222670733