Umleiten von stdout von zwei Prozessen zu einem anderen Prozess stdin in Linux-C
Ich in problem über umleiten von stdout von multi-Prozess.
Vorausgesetzt, ich habe Ein Prozess, ich benutze fork() in Einen und dann bekomme ich die Prozess A und B. Und ich fork() in B, schließlich bekomme ich Verfahren A, B und C. B und C sind durch die Implementierung anderer Programm durch exec().
Nun, ich versuche die Umleitung von stdout von A und B zu stdin von C mit zwei Leitungen.
#include<unistd.h>
#include<stdio.h>
#include<sty/types.h>
int main()
{
int AtoC [2];
pipe(AtoC);
int fd1,fd2;
fd1=fork();
if(fd1>0)
{
/***In process A, I do the following steps: ***/
close(AtoC[0]);
dup2(AtoC[1], STDOUT_FILENO);
/* program running in process A */
}
else
{
int BtoC [2];
pipe(BtoC);
fd2=fork();
if(fd2>0)
{
/***In process B, I do the following steps: ***/
close(AtoC[1]);
close(BtoC[0]);
dup2(BtoC[1], STDOUT_FILENO);
/*** execute another program in process B using execl(); ***/
}
else
{
/*** In process C, I do the following steps: ***/
close(AtoC[1]);
close(BtoC[1]);
dup2(AtoC[0],STDIN_FILENO);
dup2(BtoC[0],STDIN_FILENO);
/*** execute another different program in process C using execl(); ***/
}
}
}
Nun, nach diesen zwei Aussagen :
dup2(AtoC[0],STDIN_FILENO);
dup2(BtoC[0],STDIN_FILENO);
stdin von Prozess C ist schließlich umleiten zu BtoC[0]
,die die stdout des Prozesses B. Und die stdout von Prozess A ist nicht bestanden in Prozess C stdin.
Meine Frage ist, ob es eine Lösung lassen Sie mich umleiten beiden Verfahren A und B stdout in Prozess C stdin zur gleichen Zeit.
Andere Frage ist, ob ich das auch wollen, drucken Sie die stdout des Prozesses Einen Bildschirm, was soll ich tun? Ich kenne den Befehl tee
in die Befehlszeile ein. Ich versuche, verwenden Sie die entsprechende Funktion tee(int fd_in, int fd_out, size_t len, unsigned int flags)
im Prozess Ein, aber ich konnte nicht alles drucken des stdout des Prozesses A.
Jeder Vorschlag wird sehr geschätzt, danke.
- Schlechte Benennung von Variablen: rufen Sie nicht das Ergebnis von
fork
undfd1
(das klingt wie file-Deskriptor 1). Es ist wieder eine Prozess-id. Und jeder syscall scheitern kann:fork
können -1 zurück und setzenerrno
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, dass es eine gute Idee, aber es ist durchaus machbar. Die wichtige Beobachtung ist, dass Sie brauchen nur eine Rohr. Mehrere Prozesse (mit einem gemeinsamen Elternteil) schreiben kann, um eine einzelne Leitung. Jedoch, nur einen Datei-Deskriptor kann verwendet werden, als die standard-Eingabe. Im original-code nur an einer der Leitungen verbunden war, C als seine standard-Eingabe (die anderen waren immer noch verbunden, aber vor allem, weil Sie noch nicht geschlossen genug, Deskriptoren).
dup2()
(oderdup()
), sollten Sie in der Nähe sowohl der Dateideskriptoren, die zurückgegebenpipe()
.Versuchen, diesen code für die Größe. Ich habe reduziert die bushiness der Baum, entfernt ungenutzte Variablen (nichts verwendet die Prozess-IDs zurückgegeben, die von
fork()
), umbenannt in das Rohr, dafür gesorgt, dass es richtig geschlossen ist, die in jedem Prozess, und einige schreiben von Aktivitäten in Prozessen A und B und einige Lektüre-Aktivität in Prozess C anstelle von Kommandos ausführen. Ich gehe davon aus, dassusleep()
(micro-schlafen, schlafen Zeit, ausgedrückt in Mikrosekunden) verfügbar ist; wenn nicht, versuchen Sienanosleep()
, aber es hat eine komplexere Schnittstelle).Das hintere Ende eines auf meinem Mac (Mac OS X 10.7.5, GCC 4.7.1) produziert:
Folgenden auf Leitung teilen, möchten Sie vielleicht, um Kasse ist-es-sicher-zu-Rohr-die-Ausgabe-von-mehreren-parallel-Prozesse. Arbeiten kein problem für die kleinen schreibt, aber für den großen, die Daten erhalten können, interleaved =)
Ich weiß nicht, wie es funktioniert, und wartet auf andere Antworten auf die op. Jedoch alternativ, Sie verwenden können
epoll
-wie asynchrone I/O. Prozess müssen nicht blockieren, es auf den Ausgang des Prozesses B/C. Prozess Eine Lesen wenn Daten verfügbar.Den
man
Seite hat ein gutes Beispiel wie zu verwendentee
, nur für Ihre Referenz.Ist es nicht möglich. Die ganze Idee über pipe ist, dass es 2 enden - eines ist befestigt, um Ihre Prozess -, sagen-Prozess Ein, und der andere gehört einem anderen Prozess, sagen Sie C. Wenn Sie einen weiteren Prozess anlegen möchte, ein anderes Rohr, es muss auch 2 enden, und es ist nicht möglich, für 2 enden, zu Ende in einem Loch.
Wenn du das getan hast:
zweiter Linie effektiv überschrieb erste.
dup2(oldfd, newfd) soll in der Nähe newfd und machen es effektiv das gleiche wie oldfd. So, erste Zeile-Stecker, aber zweite Linie anschließt, und Stecker in etwas anderes.
dup2()
Aufrufe sind falsch. Ich bin nicht einverstanden mit Ihrem einleitungsstatement. Als meine Antwort zeigt, es ist möglich.