如何在popen中检测到失败的命令?

时间:2018-06-13 11:54:37

标签: c pipe posix

我正在试图弄清楚如何检测 popen 调用的命令何时失败。在下面的程序test.c中,尽管命令失败, popen 仍返回非null。有线索吗?

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    int status;

    fp = popen("foo", "r");
    if (fp != NULL) {
        puts("command successful");
        status = pclose(fp);
        if (status < 0) {
            perror(NULL);
            exit(EXIT_FAILURE);
        }
    } else {
        perror(NULL);
        exit(EXIT_FAILURE);
    }
    return 0;
}

输出:

$ ./test
command successful
sh: 1: foo: not found

1 个答案:

答案 0 :(得分:2)

据我了解man pagepclose应返回退出代码。您正在此处测试&lt; 0,如果pclose本身失败,则为真。然后,测试&gt; 0将测试被叫程序是否失败(退出代码&gt; 0)。

pclose的手册页:

  

pclose()函数等待关联的进程终止,并返回wait4返回的命令的退出状态。

  

如果wait4返回错误,或者检测到其他错误,则pclose()函数返回-1。