当我尝试用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。