Exécution d’un nouveau processus enfant en arrière-plan C linux

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.