Je tente d'utiliser Perl5 à fork()
un processus enfant. Le processus enfant doit exec()
un autre programme, en redirigeant son STDIN
vers un canal nommé, et STDOUT
et STDERR
vers les fichiers journaux. Le processus parent continue à s'exécuter dans une boucle, en utilisant waitpid
et en vérifiant $?
pour redémarrer l'enfant au cas où il meurt avec un statut de sortie différent de zéro.Rediriger STDOUT et STDERR dans exec() ... sans shell
documentation Perl pour la fonction exec()
dit:
S'il y a plus d'un argument dans LIST, cela exige execvp (3) avec les arguments en LIST. S'il n'y a qu'un seul élément dans LIST, l'argument est vérifié pour les métacaractères shell, et s'il y en a, l'argument entier est passé à l'interpréteur de commandes du système (
/bin/sh -c
sur les plateformes Unix, mais varie sur d'autres plateformes). S'il n'y a pas de métacaractères shell dans l'argument, il est divisé en mots et transmis directement àexecvp
, ce qui est plus efficace. Exemples:exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq";
Cela semble assez cool, et je voudrais lancer mon programme externe sans coquille intermédiaire, comme le montrent ces exemples. Malheureusement, je suis incapable de combiner cela avec la redirection de sortie (comme dans /bin/foo > /tmp/stdout
).
En d'autres termes, cela ne fonctionne pas:
exec ('/bin/ls', '/etc', '>/tmp/stdout');
Alors, ma question est la suivante: comment puis-je rediriger les fichiers STD*
pour mon sous-commande, sans utiliser le shell?