2009-08-03 8 views
5

J'écris un programme qui doit exécuter d'autres processus externes; En ce moment, le programme lance les lignes de commande des processus via popen, récupère toutes les sorties, puis récupère le statut de sortie via pclose. Cependant, pour les processus à exécution rapide (par exemple, les erreurs de processus lancées rapidement), l'appel de pclose ne peut pas obtenir l'état de sortie (pclose renvoie -1, errno est ECHILD).Alternatives à popen/pclose?

Existe-t-il un moyen pour moi d'imiter le comportement de type popen/pclose, sauf d'une manière qui garantit la capture de la fin du processus "event" et du code de retour résultant? Comment puis-je éviter la condition de concurrence inhérente avec pclose et la fin du processus lancé?

Répondre

3

fork/exec/wait

popen est juste un emballage pour simplifier les appels fork/exec. Si vous souhaitez acquérir la sortie de l'enfant, vous devez créer un tube, appeler fork, copier les descripteurs de fichier de l'enfant dans le tube, puis exec. Le parent peut lire la sortie du tube et appeler wait pour obtenir le statut de sortie de l'enfant.

+4

Comme le popen est disponible sur Windows, qui n'a pas de fourche, il n'est évidemment pas toujours un wrapper. –

+0

J'ai réécrit mon code pour le faire (fork/exec/dup/etc.) Et maintenant je reçois des échecs intermittents sur waitpid (...) retournant -1/errno = ECHILD. Merde. – Joe

+3

Ok: j'ai compris ça. Ce code fonctionne très bien. Mon ancien code avec popen/pclose fonctionne très bien. Ce qui ne fonctionnait PAS très bien était le gestionnaire SIGCHLD caché qui était enterré dans le code commun dont j'ai hérité. OH SNAP. J'étais fondamentalement dans une course contre ce gestionnaire (qui appelait simplement waitpid (-1, ...). Leçon apprise: lisez toute la page man, et n'assumez rien! – Joe

1

Vous pouvez utiliser vfork() et execv().