当我尝试使用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)
重定向到管道。
我希望这样做,因为我想从不受我控制的外部库中重定向数据。
答案 0 :(得分:1)
std::cerr
可以在程序内部重定向,但是stderr
不能(至少不能以我所知道的任何可移植或标准方式)。
您可以先使用std::freopen,然后才能使用std::_fileno()
获取有效的文件描述符。这可能足够,也可能不够,因此,在那之后如果您需要执行其他任何操作,则必须从自己的程序内部监视文件(例如ala。拖尾文件)并进行自定义处理。 / p>
答案 1 :(得分:0)
它在Unix中的工作方式是2引用内核表中的第2行。该表中的条目可以指向文件或类似文件的内容(套接字,管道,文件,设备,什么都没有,等等)。因此,如果那里什么也没有,表槽将仍然保留,并可以用新值填充(使用dup?
)。
但是,这是Unix,而Microsoft的Windows不是Unix。