Почему 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-программе.

Другие вопросы по тегам