Pourquoi le processus enfant renvoie-t-il l'état de sortie = 32512 dans unix?
Dans mon programme, je suis d'exécution de commande et d'obtenir le résultat (le journal, et de l'état de sortie). Aussi mon programme à l'appui de shell de commandes spécifiques (c'est à dire des commandes qui contient shell caractères spécifiques ~(tild),|(pipe),*). Mais lorsque j'essaie d'exécuter sh -c ls | wc
dans mon répertoire home via mon programme, il n'a pas et son statut de sortie a été 32512, également dans le flux stderr "sh: ls | wc: command not found"
a été imprimé.
Mais la chose intéressante est que la commande sh -c ls | wc
œuvres corriger si je le lance dans un shell.
Quel est le problème? Ou plus préférable comment puis-je lance un shell de commandes spécifiques par l'intermédiaire de mon programme (j'.ce qui commande avec quels paramètres dois-je exécuter)?
Le code de la partie de soufflet est en partie enfant après le fork(). Il executs la commande.
tokenized_command
est std::vector<std::string>
où, dans mon cas "sh", "-c", "ls", "|", "wc"
sont stockées, j'ai également essayé d'y stocker "sh", "-c", "\"ls | wc\""
mais le résultat est le même. command
est char *
où plein de ligne de commande sont stockées.
boost::shared_array<const char *> bargv(new const char *[tokenized_command.size() + 1]);
const char **argv = bargv.get();
for(int i = 0; i < tokenized_command.size(); ++i)
{
argv[i] = tokenized_command[i].c_str();
printf("argv[%d]: %s\n", i, argv[i]); //trace
}
argv[tokenized_command.size()] = NULL;
if(execvp(argv[0], (char * const *)argv) == -1)
{
fprintf(stderr, "Failed to execute command %s: %s", command, strerror(errno));
_exit(EXIT_FAILURE);
}
P. S.
Je sais que l'utilisation system(command)
au lieu execvp
peut résoudre mon problème. Mais system()
attend jusqu'à ce que la commande est terminée, et ce n'est pas assez bon pour mon programme. Et aussi, je suis sûr que dans la mise en œuvre de system()
un exec-la famille de fonctions est utilisé, de sorte que le problème peut être résolu par exec
ainsi, mais je ne sais pas comment.
source d'informationauteur Mihran Hovsepyan
Vous devez vous connecter pour publier un commentaire.
execvp
prend un chemin d'accès à un fichier exécutable, et les arguments qui à lancer le fichier exécutable. Il ne prend pas de bourne shell de commandes.ls | wc
est un bourne shell commande (entre autres), et il ne peut pas être cassé dans le chemin d'accès à un fichier exécutable et de certains arguments en raison de l'utilisation d'un tuyau. Cela signifie qu'il ne peut pas être exécutée à l'aide deexecvp
.Pour exécuter un bourne shell commande à l'aide de
execvp
on doit exécutersh
et passer-c
et la commande pour les arguments.Si vous voulez exécuter
ls | wc
à l'aide deexecvp
.Apparemment vous avez essayé
Qui serait le même que bourne shell commande
sh -c ls '|' wc
.Et les deux sont très différents de commande shell
sh -c ls | wc
. Que seraitVous semblez penser que
|
etwc
sont passés à lash
mais ce n'est pas du tout le cas.|
est un caractère spécial qui donne une pipe, pas un argument.Comme pour le code de sortie,
32512 = 0x7F00
De sorte qu'il n'est pas mort à partir d'un signal, d'un core dump n'était pas produite, et il a quitté avec le code 127 (0x7F).
Ce que 127 moyen n'est pas clair, ce qui est pourquoi il doit être accompagné par un message d'erreur. Vous avez essayé d'exécuter le programme de
ls | wc
mais il n'existe pas un tel programme.Vous devez exécuter
sh -c 'ls | wc'
.Option
-c
attend une commande dans le formulaire de chaîne de caractères. Dans la coquille bien sûr, il est de travail, car il n'y a pas de différence entre le frails
et redirection de la sortie verswc
et le lancement dels | wc
en séparer shell.