如何将stderr与输出流关联



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

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

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

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

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

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

您可以首先使用std::freopen,然后使用std::_fileno()获得有效的文件描述符。这可能不够,也可能不够,所以如果你需要在那之后发生任何其他事情,你就必须从你自己的程序中监视文件(例如,跟踪文件(并进行自定义处理。

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

然而,这是Unix,微软的Windows不是Unix。

相关内容

  • 没有找到相关文章

最新更新