2017-11-10 115 views
0

的Visual C++ 2017年 - 控制台应用程序给出错误的命令时_perror返回非空

我找到一个Windows版本POPEN,即_popen唯一的文档说,这应该是它失败时返回一个NULL_PTR。它没有提到向控制台喷出无故障的错误消息。然而,如果返回非null和喷发。我还没有找到确定管道是否连通的方法。当我使用fprintf写入坏管道时,它看起来也不会失败。这是_popen中的错误,还是我做错了?什么是解决方法?

#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; 
} 
+0

popen()是一个Posix函数,保留在MSVC++ CRT中并带有前导下划线,因为Windows曾经有一个Posix子系统。它使用Unix敏感性,将您指定的命令传递给命令行处理器Cmd.exe。如果它是垃圾,它会很高兴地投入你的控制台,它不会重定向stderr。这被认为是25年前的一项功能,通过管道发送错误消息使得Bejeezus不知道什么程序使用管道。现在它看起来像一个Windows程序员:)并没有错误,cmd.exe开始就好了。 –

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx –

回答

1

您的来电_popen()成功,因为它是在执行命令,不管你通过它的命令处理器(命令提示符,通常cmd.exe)的衍生副本的范围内。

(参见备注部分:_popen, _wpopen)。

只需打开命令提示符并键入您的"42 is a no-good command"即可证明/重新创建此文件。

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

相关问题