67 votes

Différence entre "system" et "exec" dans Linux ?

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 ?

90voto

Carl Norum Points 114072

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.

20voto

BobbyShaftoe Points 19925

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.

7voto

Timo Geusch Points 16952

system() exécutera la commande fournie dans un processus enfant qu'il génère. exec() remplacera le processus actuel par l'invocation du nouvel exécutable que vous spécifiez. Si vous voulez créer un processus enfant en utilisant la commande exec vous devrez fork() votre processus au préalable.

6voto

DigitalRoss Points 80400

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é simplement exec

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

2voto

Clifford Points 29933

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X