Почему pclose(3) не ждет завершения команды оболочки
Я хочу проверить pclose(3), будет ли она ждать завершения команды оболочки. Я пишу две маленькие программы оболочки.
//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
этот тест будет ожидать завершения оболочки и вывода состояния выхода 0. Однако когда я запускаю тест ptest в следующем виде:
$ ./ptest "sh b.sh" r
$ exit status:141
на этот раз ptest не ждет программы оболочки и немедленно завершает себя. Я просто добавляю оператор echo перед сном, но результат был другим. Я не знаю почему.
1 ответ
Решение
exit status:141
это SIGPIPE
ошибка. В этом вопросе хорошо объяснено, почему код выхода 141 с grep -q?
Проблема в том, что ваш b.sh
Скрипт пытается записать в канал, но никто не читает этот канал в вашей C-программе.