本进程stdout重定向到管道 以及恢复

目标

接管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

猜你喜欢

转载自blog.csdn.net/henysugar/article/details/108417279