/ / Pourquoi la commande pclose (3) n'attend pas la fin du shell - c, linux, popen, pclose

Pourquoi la commande shell n'attend-elle pas pclose (3) - c, linux, popen, pclose

Je veux tester le pclose (3) s'il attendra la fin de la commande shell. J'écris deux petits programmes shell.

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

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

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

puis, compilez: $ gcc -o ptest ptest.c

exécutez ensuite le ptest (mon ordinateur est Ubuntu 12.04.3 LTS):

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

ce test attendez que le shell se termine et sortir l'état de sortie 0. Cependant, lorsque j'exécute le ptest sous la forme suivante:

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

cette fois, ptest n'attend pas le programme shell et se termine immédiatement , J'ajoute juste une instruction echo avant le sommeil, mais le résultat était différent. Je ne sais pas pourquoi.

Réponses:

1 pour la réponse № 1

exit status:141 est un SIGPIPE Erreur. C'est bien expliqué dans cette question Pourquoi quitter le code 141 avec grep -q?

Le problème est que votre b.sh le script essaie d'écrire dans le canal, mais personne ne lit ce canal dans votre programme C.