Comment puis-je exec() un processus en arrière-plan en C?
J'ai fait un fork et exec() sur un processus, mais je tiens à le lancer en arrière-plan. Comment puis-je faire cela?
Je peux juste éviter d'appeler waitpid sur elle, mais alors le processus y est assis pour toujours, attendant le retour de son état à la société mère. Est-il un autre moyen pour ce faire?
OriginalL'auteur Vlad the Impala | 2009-10-24
Vous devez vous connecter pour publier un commentaire.
Attraper SIGCHLD et dans le gestionnaire, l'appel en attente().
Certaines saveurs de Posix (je pense que *BSD, mais ne cite pas moi), si vous l'ignorez SIGCHLD, le noyau va nettoyer automatiquement les processus zombie (qui est ce que vous voyez en ps). C'est une fonctionnalité intéressante, mais pas portable.
Pour les futurs programmeurs avec la même question, voici ce que j'ai trouvé sur la page 293 de "Advanced Programming in the UNIX Environment": SIGCHLD Quand un processus se termine ou s'arrête, le SIGCHLD est envoyé à la société mère. Par défaut, ce signal est ignoré, de sorte que le parent doit prendre ce signal si elle veut être informé chaque fois qu'un enfant change d'état. L'action normale dans le signal d'attraper la fonction est d'appeler l'un de l'attente des fonctions pour extraire l'enfant de l'ID de processus et de cessation d'état. Dans ce cas, j'ai juste besoin d'une ligne comme celle-liw.fi suggéré: waitpid(-1,&état,WNOHANG | WUNTRACED);
OriginalL'auteur R Samuel Klatchko
Je pense que ce que vous essayez de faire est de créer un processus de démon. Lire cette lien sur Wikipedia pour l'explication.
Un exemple (de Steven Advanced Programming in the Unix Environment) pour la réalisation d'un processus d'un démon:
Bien sûr, cela suppose un Unix comme système d'exploitation.
Si votre programme inclut la fonction ci-dessus et l'appelle dès qu'il est exécuté. Il est alors disassoicated de ce processus parent et va tout simplement continuer à courir jusqu'à ce qu'elle se termine ou il est tué.
Si vous voulez le faire, vous aussi vous voulez l'original de votre processus de l'appel en attente() pour récolter il est enfant. Depuis le processus enfant d'en sortir rapidement (à droite après la bifurcation, le petit-fils), l'original de votre processus ne bloquera pas longtemps à attendre().
OriginalL'auteur Jackson
waitpid(-1, &status, WNOHANG)
de pouvoir faire ce que vous avez besoin: elle doit retourner immédiatement si aucun enfant n'processus a quitté. Sinon, vous pouvez écouter le signal SIGCHLD.Malheureusement, j'ai eu exactement le résultat Martin prédit, mais il sonnait bien jusqu'alors.
Tout cela dépend de la façon dont le processus parent est structuré. Il est parfois plus facile à interroger de manière occasionnelle plutôt que de prendre SIGCHLD.
OriginalL'auteur
Fourche pour créer le thread d'arrière-plan et puis exec. Voir dupe question sur ce site: Peut-on commencer un processus d'arrière-plan à l'aide de exec() donnant & comme argument?
Je ne pense pas que les réponses à la dernière question en fait répondre à ça (comme aditya se plaint aussi); la bonne réponse a été donnée par Avi. En outre, je suis sceptique à ce que les réponses à la dernière question en fait ne répondre à cette dernière question (depuis l'OP aussi voulu créer un processus d'arrière-plan, et personne ne lui a dit à propos de double-fourche).
OriginalL'auteur popester