Chcę przetestować pclose (3), czy będzie czekać na zakończenie polecenia powłoki. Piszę dwa małe programy powłoki.
//a.sh
#!/bin/bash
sleep 3
//b.sh
#!/bin/bash
echo "something"
sleep 3
program 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:%dn", WEXITSTATUS(t));
}
return 0;
}
następnie skompiluj: $ gcc -o ptest ptest.c
następnie uruchom ptest (mój komputer to Ubuntu 12.04.3 LTS):
$ ./ptest "sh a.sh" r
$ exit status:0
ten test będzie poczekaj, aż powłoka się zakończy i wyjściowy status wyjścia 0. Jednak po uruchomieniu ptest w następującej formie:
$ ./ptest "sh b.sh" r
$ exit status:141
tym razem ptest nie czeka na program powłoki i natychmiast się kończy, po prostu dodaję echo przed snem, ale wynik był inny. Nie wiem dlaczego.
Odpowiedzi:
1 dla odpowiedzi № 1exit status:141
jest SIGPIPE
błąd. Jest dobrze wyjaśnione w tym pytaniu Po co kończyć kod 141 za pomocą grep -q?
Problem polega na tym, że twój b.sh
skrypt próbuje zapisać do potoku, ale nikt nie czyta tego potoku w twoim programie C.