如何将stderr与输出流关联

时间:2018-11-13 11:42:26

标签: c++ windows stderr

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

您可以先使用std::freopen,然后才能使用std::_fileno()获取有效的文件描述符。这可能足够,也可能不够,因此,在那之后如果您需要执行其他任何操作,则必须从自己的程序内部监视文件(例如ala。拖尾文件)并进行自定义处理。 / p>

答案 1 :(得分:0)

它在Unix中的工作方式是2引用内核表中的第2行。该表中的条目可以指向文件或类似文件的内容(套接字,管道,文件,设备,什么都没有,等等)。因此,如果那里什么也没有,表槽将仍然保留,并可以用新值填充(使用dup?)。

但是,这是Unix,而Microsoft的Windows不是Unix。