C++ 如何将stderr与输出流关联

C++ 如何将stderr与输出流关联,c++,windows,stderr,C++,Windows,Stderr,当我尝试使用fileno(stderr)获取stderr的文件描述符时,结果是-2而不是2。的文档中说,这可能是因为在没有控制台窗口的Windows应用程序中,stderr与输出流没有关联 我需要stderr文件描述符,因为我想将stderr重定向到管道使用,所以使用fprintf(stderr,“…”)和std::cerrstd::cerr编写的所有内容都可以在程序内部重定向,但stderr无法(至少在我所知的任何便携式或标准方式中都没有) 您可以先使用,然后使用std::_fileno()获

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


我需要
stderr
文件描述符,因为我想将
stderr
重定向到管道使用,所以使用
fprintf(stderr,“…”)
std::cerr
std::cerr
编写的所有内容都可以在程序内部重定向,但
stderr
无法(至少在我所知的任何便携式或标准方式中都没有)


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

它在Unix中的工作方式是,2引用内核中具有的表中的第2行。表中的此项可以指向和文件或类似文件的内容(套接字、管道、文件、设备、nothing等)。因此,如果没有任何内容,表槽仍将保留,并可以用新值填充(使用
dup?


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

简单地
dup2(pipeFD,STDERR\u FILENO);
?还没有测试,但应该可以。我尝试使用dup2(pipeFD,2),因为Windows中没有定义STDERR_FILENO。它可以编译和运行,但我无法从管道中读取我写入它的内容。无论如何,如果我有控制台应用程序,它可以正常工作。我假设STDERR的某些内容没有正确初始化?您可以直接写入管道吗?或者您正在尝试重定向数据,这不在您的控制范围内ol?我以为我有一个解决方案,但它涉及到
fork
(微软的Windows无法做到这一点)@ctrl-alt-delor,是的,我想重定向不受我控制的外部库中的数据。嗨,如果可能的话,我想使用管道。Digby Chicken Caesar爵士提出的解决方案在我有控制台应用程序的情况下有效。我可以将std::cerr和stderr重定向到我的自定义日志,但如果应用程序有没有控制台窗口。@ŽigaGolob恐怕你运气不好-就像我说的,你被freopen调用卡住了。但是为什么要开始使用stderr?我想现在没有人真正使用stderr做任何事情。除非你没有选择(为什么?)。正如你所说,我没有选择,因为外部库使用
fprintf写错误(标准“…”)
。无论如何,如果这不可能,我会感到惊讶/无法理解。如果我有控制台应用程序,为什么我可以这样做。有什么区别吗?@igaGolob然后你坚持使用
freopen
打开调用-也许如果你先使用它,你可以应用你链接的其他“黑客/解决方案”。我不确定我是否理解你在我的例子中如何使用
freopen
。实际上,我已经尝试将
stderr
重定向到两个临时文件,并交替读取,它正在工作。如果可能的话,现在我想对管道执行此操作。您是否建议我首先使用
freopen
重定向到物理文件,然后将其重定向到管道?因为是对文件描述符工作原理的解释。注意MS没有文件描述符(这只是假装的)。