我想测试一下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语句,但结果却不同了。我不知道为什么。
答案 0 :(得分:1)
exit status:141
是SIGPIPE
错误。在这个问题Why exit code 141 with grep -q?
问题是您的b.sh
脚本尝试写入管道,但没有人在您的C程序中读取此管道。