如何将 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。
当我尝试使用 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。