Visual c++ _当给出错误的命令时,perror返回非NULL Visual C++ 2017——控制台应用程序

Visual c++ _当给出错误的命令时,perror返回非NULL Visual C++ 2017——控制台应用程序,visual-c++,visual-studio-2017,popen,windows-console,Visual C++,Visual Studio 2017,Popen,Windows Console,我找到的关于Windows版本的popen的唯一文档,即_popen,说它应该在失败时返回空的_ptr。它没有说明向控制台发出一条无端的错误消息。然而,if返回非null并spews。我还没有找到确定管道是否连接的方法。当我使用fprintf写入坏管道时,它似乎也不会失败。这是波本的错误,还是我做错了?解决办法是什么 #include "stdafx.h" #include <stdio.h> #include <iostream> int main() { //

我找到的关于Windows版本的popen的唯一文档,即_popen,说它应该在失败时返回空的_ptr。它没有说明向控制台发出一条无端的错误消息。然而,if返回非null并spews。我还没有找到确定管道是否连接的方法。当我使用fprintf写入坏管道时,它似乎也不会失败。这是波本的错误,还是我做错了?解决办法是什么

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
int main()
{
    // This program is expected to write 
    // 00000000
    // Good
    // 
    // Instead it writes (e.g.), in this order,
    // 0082F2C0
    // Not good
    // '42' is not recognized as an interal or external command,
    // operable program or batch file.

    FILE* fp = _popen("42 is a no-good command", "w");
    std::cout << fp << std::endl;
    if (!fp) {
        std::cout << "Good" << std::endl;
    }
    else {
        std::cout << "Not good" << std::endl;
    }
    return 0;
}
#包括“stdafx.h”
#包括
#包括
int main()
{
//该程序预计将编写
// 00000000
//好
// 
//相反,它会按以下顺序写入(例如),
//0082F2C0
//不好
//“42”不被识别为内部或外部命令,
//可操作的程序或批处理文件。
FILE*fp=_popen(“42是一个不好的命令”,“w”);

std::cout您对
\u popen
()的调用成功,因为它正在执行您在生成的命令处理器副本(命令提示符,通常为
cmd.exe
)的上下文中传递的任何命令

(请参见此处的备注部分:)

您只需打开命令提示符并键入
“42是一个不好的命令”
,就可以证明/重新创建这一点

您应该得到与程序产生的错误完全相同的错误。

popen()是一个Posix函数,保留在MSVC++CRT中,带有一个前导下划线,因为Windows曾经有一个Posix子系统。它使用Unix敏感度,您指定的命令被传递到命令行处理器Cmd.exe。如果它是垃圾,它将很高兴地喷入您的控制台,它不会重定向stderr。这被认为是一个功能25+几年前,通过管道发送错误消息会使bejeezus与任何使用管道的程序混淆。现在它使用了Windows程序员:)并且没有错误,cmd.exe启动得很好。