Je suis en train d'implémenter des piping sur un système de fichiers simulé en C++ (avec surtout du C). Il doit exécuter des commandes dans le shell hôte, mais effectuer lui-même la tuyauterie sur le système de fichiers simulé.Peut popen() faire des tuyaux bidirectionnels comme pipe() + fork()?
je pourrais y parvenir avec les pipe()
, fork()
et system()
appels système, mais je préfère utiliser popen()
(qui gère la création d'un tuyau, bifurquer un processus, et en passant une commande à la coquille). Cela peut ne pas être possible parce que (je pense) je dois pouvoir écrire du processus parent du tuyau, lire sur la fin du processus enfant, écrire la sortie de l'enfant, et enfin lire cette sortie du parent. La page de manuel pour popen()
sur mon système indique qu'un canal bidirectionnel est possible, mais mon code doit être exécuté sur un système dont l'ancienne version ne prend en charge que les canalisations unidirectionnelles.
Avec les appels séparés ci-dessus, je peux ouvrir/fermer des tuyaux pour y parvenir. Est-ce possible avec popen()
?
Pour un exemple trivial, pour exécuter ls -l | grep .txt | grep cmds
je dois:
- Ouvrir un tuyau et un processus pour exécuter
ls -l
sur l'hôte; lire la sortie arrière - redirigez la sortie de
ls -l
retour à mon simulateur - Ouvrir un tuyau et un processus pour exécuter
grep .txt
sur l'hôte sur la sortie canalisée dels -l
- redirigez la sortie de ce retour au simulateur (coincé ici)
- Ouvrir un tuyau et un processus pour exécuter
grep cmds
sur l'hôte sur la sortie de canaliséegrep .txt
- redirigez la sortie de ce retour au simulateur et l'imprimer
homme Popen
De Mac OS X:
La fonction
popen()
'ouvre' un processus en créant un tuyau bidirectionnel, bifurquer, et en invoquant la coquille. Tous les flux ouverts par les appelspopen()
précédents dans le processus parent sont fermés dans le nouveau processus enfant. Historiquement,popen()
a été implémenté avec un tuyau unidirectionnel; par conséquent, de nombreuses implémentations depopen()
seulement permettent à l'argument de mode de spécifier lecture ou écriture, pas les deux. Parce quepopen()
est maintenant implémenté en utilisant un tube bidirectionnel , l'argument de mode peut demander un flux de données bidirectionnel. L'argument mode est un pointeur vers une chaîne terminée par un zéro qui doit être 'r' pour la lecture, 'w' pour l'écriture ou 'r +' pour la lecture et l'écriture.
Ignore ce mauvais manuel, ce qui fait paraître comme unidirectionalité de tuyaux est un comportement hérité. Le comportement de votre implémentation est non standard et ne sera probablement jamais pris en charge dans d'autres environnements. Configurez simplement les tuyaux et la fourche et exécutez-vous, et tout sera heureux. –
Tout ce fil est fait de victoire, toutes les réponses et la question méritent +1. –
Je viens de faire un ** homme popen ** sur Ubuntu 13.04 et il dit: 'Puisqu'un tube est par définition unidirectionnel, l'argument type peut spécifier uniquement la lecture ou l'écriture, pas les deux; le flux qui en résulte est en lecture seule ou en écriture seule. Je suis surpris que ce soit le "plus vieux" popen ... – sager89