2017-05-21 3 views
0

Bonjour, j'ai de la difficulté à contourner ce concept.Tuyauterie de deux fichiers à partir d'un fichier externe (ou d'un fichier de contrôle) en C unix

je dois exécuter deux fichiers permet de dire ca & bc à partir d'un fichier de contrôle appelé control.c

Je veux redirigez la sortie de courant alternatif à l'entrée bc

Je comprends que les descripteurs de fichiers (fd): fd 0 = stdin fd = 1 stdout

Je crois que la création d'un tuyau nécessite un tableau d'entiers (deux FDS)

e.g. 
zpipe[2] 
pipe(zpipe) 

Je veux exécuter les fichiers a et b et diriger la sortie de a vers l'entrée de b.

Cependant, je suis confus au concept que l'ouverture ou la lecture de ces fichiers créerait un nouveau fd. Je comprends que le fd d'un (par exemple fda) peut être mis à 0 en appelant fda = dup2 (fd, 0). Cela ne casserait-il pas le tuyau puisque 0 est maintenant fermé?

si j'ai appelé

execvp("a.c", args) 
execvp("b.c", args) 

comment j'assurer que ces fichiers sont correctement canalisé et attendu?

+0

Votre nomenclature est source de confusion (à us), ou montre que vous êtes confus Généralement, 'ac' est un fichier source C - et il serait compilé dans un programme autonome' a' (ou peut-être 'a.exe') .Vous exécutez des programmes ou les exécutez. Il serait inhabituel (pas impossible, mais certainement inhabituel) d'avoir un programme exécutable nommé 'ac'. Idem pour' bc' et 'b'. Vous pouvez appeler' if (dup2 (zpipe [0], 0)! = 0) {... gérer l'erreur ...} ', ou' if (dup2 (zpip e [1], 1)! = 0) {... gérer l'erreur ...} '. –

+0

Vous devez décider si 'control' crée deux fois le pipe et le fork, une fois pour exécuter' a' et une fois pour exécuter 'b', ou si' control' se remplace par un de 'a' ou' b', ou si Le controle '' '' forcer et l'enfant crée le tube et ensuite les fourchettes et le petit-fils exécute un processus (il peut être 'a' ou' b') pendant que l'enfant exécute l'autre et 'control' attend que son enfant finisse. Tout est possible en l'absence d'autres informations, il n'est pas clair qu'il existe une «meilleure» solution. Si 'control' doit en faire plus, la solution single-fork ne sera pas appropriée. –

+0

Salut Jonathan a.c a été utilisé comme un exemple de nom, il pourrait être ex1.c & ex2.c ou autre. Le but de ce que j'essaie de faire est d'obtenir des entrées de a.c (ou ex1.c selon le cas) et de les envoyer à b.c pour traitement et sortie. Cependant, après d'autres recherches, j'ai noté que la meilleure pratique est de "créer deux fois la méthode pipe and forks", mais j'ai encore du mal à comprendre comment le contrôle maintient le flot de -> b – rowboat

Répondre

0

Vous voudrez probablement utiliser un tuyau et une fourche pour obtenir les résultats souhaités. Jetez un oeil aux réponses à this question.

+0

Ce n'est vraiment pas une réponse - ce devrait être un commentaire. –

0

Compris. J'essayais d'exécuter execvp avec des programmes définis par l'utilisateur. où j'ai appelé execvp ("ac, args)

je aurais dû appeliez

execvp (" ./ a », args)

erreur Rookie toutes mes excuses