为什么pclose(3)不等待shell命令终止

时间:2013-12-16 12:31:06

标签: c linux popen pclose

我想测试一下pclose(3)是否会等待shell命令终止。我写了两个小shell程序。

//a.sh
#!/bin/bash
sleep 3

//b.sh
#!/bin/bash
echo "something"
sleep 3

c程序:

//ptest.c

#include <stdio.h>
#include <sys/wait.h>

int main(int argc, char **argv) {
    char *filename = argv[1];
    char *mode = argv[2];
    FILE *fl = popen(filename, &mode);
    int t = pclose(fl);
    if(WIFEXITED(t)) {
        printf("exit status:%d\n", WEXITSTATUS(t));
    }
    return 0;
}

然后,编译:     $ gcc -o ptest ptest.c

接下来运行ptest(我的电脑是Ubuntu 12.04.3 LTS):

$ ./ptest "sh a.sh" r
$ exit status:0

此测试将等待shell终止并输出退出状态0.但是,当我按以下形式运行ptest时:

$ ./ptest "sh b.sh" r
$ exit status:141

这次,ptest不要等待shell程序并立即终止,我只是在睡眠前添加一个echo语句,但结果却不同了。我不知道为什么。

1 个答案:

答案 0 :(得分:1)

exit status:141SIGPIPE错误。在这个问题Why exit code 141 with grep -q?

中有很好的解释

问题是您的b.sh脚本尝试写入管道,但没有人在您的C程序中读取此管道。