【发布时间】:2012-06-14 22:27:39
【问题描述】:
我正在使用多线程程序。
首先我将我的标准输出重定向到某个文件。那里没问题(我使用了dup2(fd, 1),其中fd 是文件的文件描述符)。
之后,我需要再次将我的标准输出重定向到终端。
我的第一种方法:
/*Declaration*/
fpost_t stream_sdout;
/*code*/
if ( fgetpos( stdout, &stream_sdout) == -1 )
perror(Error:);
上面写着非法搜索。
不知道为什么会这样。
但如果我让它工作,那么我只需要使用fsetpos(stdout, &stream_stdout) 就可以了。
我的第二个想法是使用dup2(stdout, 4) 将标准输出复制到文件描述符表的位置 4。但这也不起作用。
如何将标准输出切换回其原始目标(终端、管道、文件等)?
【问题讨论】:
-
我感觉像这样移动
stdout可能是个坏主意——终端 应该在fgetpos()中准确报告什么位置?为什么不简单地打开一个文件并使用fwrite()或fprintf()或write()输出到它,然后在需要时通过/dev/tty输出到终端? -
@sarnold:可能是因为程序有库或其他不可更改的代码,它们硬连线到
stdout。 -
@sarnold 我实际上并没有考虑到这种可能性。让我快速检查一下。
-
我没有足够的信息来发布一个好的答案,所以我改为发表评论。在 Windows 中,您可以重新连接控制台。我会查看任何 Win32 SDK 文档。这并不难;我只是不记得该怎么做。
-
@sarnold 感谢您的建议!那要容易得多。我能够让它完美地工作。我仍然怀疑是否可以恢复标准,但你的解决方案让我摆脱了困境。谢谢!