Quelle est la différence entre system
y exec
les commandes familiales ? En particulier, je veux savoir laquelle d'entre elles crée un processus enfant pour fonctionner ?
Réponses
Trop de publicités?system()
appelle à sh
pour gérer votre ligne de commande, afin que vous puissiez obtenir l'expansion des caractères génériques, etc. exec()
et ses amis remplacent l'image de processus actuelle par une nouvelle image de processus.
Avec system()
votre programme continue de fonctionner et vous recevez un état de la commande externe que vous avez appelée. Avec exec()
votre processus est anéanti.
En général, je suppose que vous pouvez penser à system()
comme interface de niveau supérieur. Vous pouvez reproduire sa fonctionnalité vous-même en utilisant une combinaison de fork()
, exec()
y wait()
.
Pour répondre à votre dernière question, system()
entraîne la création d'un processus enfant, et l'option exec()
la famille ne le font pas. Vous devez utiliser fork()
pour ça.
La fonction exec remplace l'image du processus en cours d'exécution ; en cas de succès, aucun enfant n'est créé (sauf si vous le faites vous-même auparavant avec fork()
). La fonction system() fait bifurquer un processus enfant et revient lorsque l'exécution de la commande fournie est terminée ou qu'une erreur se produit.
Pour créer un processus :
-
fork(2)
un appel système directement au noyau
Pour exécuter un programme, en remplaçant l'image actuelle :
-
execve(2)
un appel système directement au noyau, généralement appelé simplementexec
Pour attendre la fin d'un processus enfant :
-
wait(2)
un appel système directement au noyau
Pour exécuter un programme dans un shell dans un processus enfant et attendre qu'il se termine :
-
system(3)
une fonction de bibliothèque
_Pour obtenir le pages de manuel pour tout ce qui précède :_
$ man 2 fork execve wait
$ man 3 system
System() invoquera l'interpréteur de commandes par défaut de votre système, qui exécutera la chaîne de commande passée en argument, qui elle-même peut ou non créer d'autres processus, cela dépend de la commande et du système. Dans tous les cas, au moins un processus shell de commande sera créé.
Avec system(), vous pouvez invoquer n'importe quelle commande, alors qu'avec exec(), vous ne pouvez invoquer qu'un fichier exécutable. Les scripts et les fichiers batch doivent être exécutés par le shell de commande.
En fait, il s'agit d'éléments totalement différents utilisés à des fins différentes. De plus, exec() remplace le processus appelant, et ne revient pas. Une comparaison plus utile serait entre system() et spawn(). Bien que system soit plus simple à invoquer, il renvoie une valeur qui vous indique si le shell de commande a été invoqué, et ne vous dit rien sur le succès de la commande elle-même. Avec spawn(), vous pouvez obtenir le code de sortie du processus ; par convention, une valeur non nulle est utilisée pour indiquer des conditions d'erreur. Comme exec() spawn() doit invoquer un exécutable, pas un shell script ou une commande intégrée.