J’essaie de lancer un nouveau processus en arrière-plan pour pouvoir continuer à travailler avec le processus parent.
J’ai utilisé fork puis execl. J’ai essayé d’append à la commande execl l’argument & mais cela ne fonctionne pas:
execl("newproc","newproc","arg1","&",NULL);
y-a-t’il une solution?
Le problème est que &
n’est pas une option de ligne de commande pour les programmes. Au lieu de cela, il s’agit simplement d’une syntaxe de shell spéciale qui place une commande en arrière-plan. La particularité des programmes en arrière-plan est qu’ils ne sont pas connectés à un terminal et que celui-ci n’attend pas la fin du processus. La fonction appropriée est daemon()
. Faites un man daemon
pour savoir comment il est utilisé.
L’enfant s’exécutera en arrière-plan puisque vous avez utilisé fork
. L’enfant continuera à fonctionner en parallèle avec le parent (si exec
réussit). Si vous voulez savoir si le processus enfant a réussi ou non (et votre code devrait l’être), vous devriez éventuellement appeler waitpid
pour collecter son statut de sortie. Sinon, vous devez appeler fork
deux fois et laisser le processus intermédiaire quitter sans wait
l’enfant, de sorte que init
adopte le processus des petits-enfants.
Comme @mah l’a dit, le &
est inutile. Mais un autre changement est nécessaire à cette ligne; execl
est une fonction execl
, et les prototypes de fonction ne prennent donc pas soin de convertir les arguments en un type correct. Par conséquent, le dernier argument doit être passé avec le type correct. Modifiez-le simplement en (char*)NULL
.
Vous mentionnez que votre code n’a pas fonctionné. Bien que cela puisse être simplement dû au faux, cela peut également être dû au premier argument. La fonction execl
ne cherche pas le programme nommé dans $PATH
. Par conséquent, à moins que newproc
ne newproc
trouve réellement dans le répertoire en cours, cette invocation de execl()
sera execl()
. Quand execl
revient, cela indique toujours qu’il y a un problème. Le moyen le plus simple de résoudre ce problème consiste à utiliser execlp()
place de execl()
. L’approche alternative consiste à spécifier un chemin absolu comme premier argument. Vous pouvez même spécifier un chemin relatif comme premier argument, mais cela est rarement utile.
&
n’est pas un argument de commande, c’est un indicateur que le shell utilise pour savoir exécuter la commande en arrière-plan. Dans ce cas, vous effectuez le travail du shell … supprimez le &
. Puisque vous execl()
avoir appelé fork()
, tant que vous exécutez execl()
dans le processus enfant après les retours de fork, vous utilisez déjà l’arrière-plan.