给出错误的命令时_perror返回非空
问题描述:
的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;
}
答
您的来电_popen
()成功,因为它是在执行命令,不管你通过它的命令处理器(命令提示符,通常cmd.exe
)的衍生副本的范围内。
(参见备注部分:_popen, _wpopen)。
只需打开命令提示符并键入您的"42 is a no-good command"
即可证明/重新创建此文件。
你应该得到与你的程序正在产生完全相同的错误。
popen()是一个Posix函数,保留在MSVC++ CRT中并带有前导下划线,因为Windows曾经有一个Posix子系统。它使用Unix敏感性,将您指定的命令传递给命令行处理器Cmd.exe。如果它是垃圾,它会很高兴地投入你的控制台,它不会重定向stderr。这被认为是25年前的一项功能,通过管道发送错误消息使得Bejeezus不知道什么程序使用管道。现在它看起来像一个Windows程序员:)并没有错误,cmd.exe开始就好了。 –
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx –