/ / Dlaczego pclose (3) nie czeka na zakończenie polecenia powłoki - c, linux, popen, pclose

Dlaczego pclose (3) nie czeka na zakończenie polecenia powłoki - c, linux, popen, pclose

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 № 1

exit 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.