2017-06-13 10 views
1

J'ai un script shell qui contient les lignes suivantes:Obtenir le code de sortie d'un script shell, dans un programme C

if [ $elof -eq 1 ]; 
then exit 3 
else if [ $elof -lt 1 ];then 
    exit 4 
else 
    exit 5 
fi 
fi 

Dans mon programme C j'utilise popen pour exécuter le script comme ceci:

char command[30]; 
char script[30]; 
scanf("%s", command); 
strcpy(script, "./myscript.sh "); 
strcat(script, command); 
FILE * shell; 
shell = popen(script, "r"); 
if(WEXITSTATUS(pclose(shell))==3) { 
    //code 
} 
else if(WEXITSTATUS(pclose(shell))==4){ 
    //code 
} 

Maintenant, comment obtenir le code de sortie du script? J'ai essayé d'utiliser WEXITSTATUS, mais il ne fonctionne pas:

WEXITSTATUS(pclose(shell)) 
+0

Qu'est-ce que vous montrez ne donne pas assez de contexte. S'il vous plaît montrer un morceau de code complet avec la sortie attendue et réelle. – dbush

+1

Afficher plus de votre code C ... btw, vous ne devez utiliser 'WEXITSTATUS()' que si WIFEXITED() 'évalue * true * –

+0

J'ai modifié mon code C. –

Répondre

3

After you have closed a stream, you cannot perform any additional operations on it.

Vous ne devez pas appeler read ou write ou même pclose après avoir appelé pclose sur un objet fichier!

pclose signifie que vous avez terminé avec FILE * et libère toutes les structures de données sous-jacentes (proof).

L'appeler une seconde fois peut donner n'importe quoi, y compris 0.

Votre code devrait ressembler à ceci:

... 
int r = pclose(shell); 
if(WEXITSTATUS(r)==3) 
{ 
      printf("AAA\n"); 
} 
else if(WEXITSTATUS(r)==4) 
{ 
      printf("BBB\n"); 
} else { 
    printf("Unexpected exit status %d\n", WEXITSTATUS(r)); 
} 
...