【发布时间】:2019-04-16 05:52:13
【问题描述】:
当我尝试使用 fileno(stderr) 获取 stderr 的文件描述符时,结果是 -2 而不是 2。fileno 的文档说这可能是因为在没有控制台窗口 @987654325 的 Windows 应用程序中@ 与输出流无关。
我需要stderr 文件描述符,因为我想使用_dup2() 将stderr 重定向到管道,因此使用fprintf(stderr, "...") 和std::cerr << "..." 编写的所有内容都将重定向到管道。
我的问题是是否可以在没有控制台窗口的 gui 应用程序中获取 stderr 的文件描述符?我可以在调用fileno(stderr) 之前以某种方式打开默认的stderr 文件描述符吗?
编辑:
根据@darune 提出的想法,我设法通过首先调用freopen("temp.txt", "w",stderr) 然后调用fileno(stderr) 来获取文件描述符来将fprintf(stderr, "...") 重定向到管道。
我希望这样做,因为我想从不受我控制的外部库重定向数据。
【问题讨论】:
-
简单的
dup2(pipeFD, STDERR_FILENO);怎么样?尚未测试,但应该可以解决问题。 -
我尝试使用 dup2(pipeFD, 2),因为 Windows 中没有定义 STDERR_FILENO。它编译并运行,但我无法从管道中读取我写给它的东西。无论如何,如果我有控制台应用程序,它可以正常工作。我假设 stderr 的某些内容未正确初始化?
-
你能写到管道吗?还是您尝试重定向不受您控制的数据?
-
我以为我有一个解决方案,但它涉及
fork(MS的Windows无法做到这一点)。 -
@ctrl-alt-delor,是的,我想从不受我控制的外部库中重定向数据。