如何将 stderr 与输出流相关联

How to associate stderr with output stream

当我尝试使用 fileno(stderr) 获取 stderr 的文件描述符时,结果是 -2 而不是 2。fileno 的文档说那可能是因为在Windows 没有控制台的应用程序 window stderr 未与输出流关联。

我需要 stderr 文件描述符,因为我想将 stderr 重定向到使用 _dup2() 的管道,因此使用 fprintf(stderr, "...")std::cerr << "..." 编写的所有内容都将被重定向到管道。

我的问题是是否可以在没有控制台 window 的 gui 应用程序中获取 stderr 的文件描述符?我可以在调用 fileno(stderr) 之前以某种方式打开默认的 stderr 文件描述符吗?

编辑:
根据@darune 提出的想法,我设法通过首先调用 freopen("temp.txt", "w",stderr) 然后调用 fileno(stderr) 获取文件描述符来将 fprintf(stderr, "...") 重定向到管道。

我想这样做,因为我想从不受我控制的外部库重定向数据。

std::cerr 可以在您的程序中重定向,但 stderr 不能(至少不能以我所知道的任何可移植或标准方式)。

你可以先用std::freopen,然后用std::_fileno()得到有效的文件描述符。这可能不够,也可能不够,所以如果在那之后你需要发生任何其他事情,你将不得不从你自己的程序内部监视文件(例如,ala.tailing 文件)并进行自定义处理。

它在 Unix 中的工作方式是 2 在内核中引用 table 中的第 2 行。 table 中的这个条目可以指向文件或文件之类的东西(套接字、管道、文件、设备、什么都没有……)。因此,如果那里什么都没有,table 插槽仍将保留,并且可以填充一个新值(使用 dup?)。

不过这是Unix,微软的Windows不是Unix。