2016-02-11 1 views
2

J'appelle:Pourquoi pclose() renvoie 32512 (code de sortie 127) lorsque system() réussit une commande identique?

FILE *fp = popen(cmd,"r"); 
... 
fprintf(stderr,"%d\n",pclose(fp)); 

J'appelle ce à partir d'un script CGI. Cela a l'habitude de fonctionner, mais récemment la commande en cours d'exécution a commencé à échouer mystérieusement, donc j'ai ajouté le fprintf pour voir quel code d'état pclose() retourne, et j'ai été surpris de voir qu'il est 32512, ce qui correspond à un code de sortie os 127. J'ai vérifié que la commande n'est pas réellement exécutée, et la valeur de retour correspond à l'état de sortie 127.

J'ai essayé d'exécuter otool -L sur le binaire en cours d'exécution, et tout semble bien. J'appelle la commande avec le chemin d'accès complet à la commande, donc il n'y a pas de changement, il ne trouve pas l'exécutable. J'ai imprimé le répertoire courant pour m'assurer que je suis où je pense que je suis, et ai vérifié que le binaire est visible.

Si j'exécute exactement la même commande connectée comme le même utilisateur que le CGI s'exécute comme il fonctionne bien. Si je cours exactement la même commande en la passant à system() cela fonctionne aussi! Il échoue seulement lorsque j'essaie de l'exécuter via popen().

La commande ne semble même pas avoir d'importance! Je l'ai remplacé par d'autres commandes telles que ls et j'ai toujours ce code de sortie bizarre.

Je suis à court de choses à essayer. Quoi d'autre cela pourrait-il être?

Répondre

0

Au cas où quelqu'un rencontrerait ce problème dans le futur, voici comment je l'ai résolu. Il y avait un appel précédent à popen() dans le code et une revue du code a montré qu'il a été fermé par erreur avec fclose() au lieu de pclose(). Parce que l'appel popen précédent a été fermé de manière incorrecte, il a empêché les futures invocations de fonctionner correctement.