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