2013-12-16 3 views
1

Я хочу проверить pclose (3), будет ли он ждать завершения команды оболочки. Я пишу две маленькие программы оболочки.Почему pclose (3) не ожидает завершения команды оболочки

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

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

с программой:

//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; 
} 

затем компилировать: $ НКУ -o Ptest ptest.c

рядом запустить Ptest (мой компьютер Ubuntu 12.04.3 LTS):

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

этот тест будет wait shell разорвать и выход состояния выхода 0.However когда я бегу Ptest как следующий вид:

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

на этот раз, Ptest не ждать оболочки программы и завершает свою работу сразу, я просто добавить эхо заявление перед сном, но результат был другим. Я не знаю почему.

+1

Разве вы не задали [тот же вопрос] (http://stackoverflow.com/q/20607398/464709) несколько часов назад? –

+0

Возможно, это проблема ввода-вывода. Попробуйте 'fgets()' ваш файловый дескриптор (см. [Пример] (http://pubs.opengroup.org/onlinepubs/7999959899/functions/popen.html)). – jml

+0

Из чего вы заключаете, что оболочка завершена или нет? – alk

ответ

1

exit status:141 является ошибкой SIGPIPE. Это хорошо объяснено в этом вопросе Why exit code 141 with grep -q?

Проблема заключается в том, что ваш сценарий b.sh пытается записать в трубу, но никто не читает этот канал в вашей программе на C.

+0

спасибо за ваш ответ, чем помогите мне получить причину. – yuxing

+0

Но, как сказал apue: «Если мы напишем трубку, конец которой был закрыт, сигнал SIGPIPE генерируется» в главе 15.2, в моем случае я не закрываю считываемый конец и просто не читаю труба. \t Кроме того, когда я вызываю pclose (3), команда echo в b.sh имеет законченную возможность. – yuxing

Смежные вопросы