Moin,Moin
Ich würde gerne wissen, wie man UNIX pipes verwenden kann. Es gibt zwar die pipe() Funktion und so weiter, aber so richtig schlau werde ich daraus nicht(auch nicht aus Apples Dokumentation). Vielleicht kann mir ja hier jemand helfen.
Stefan
P.S:Ich hab noch ne andere Frage offen:
http://www.wer-weiss-was.de/cgi-bin/forum/showarticl…
Ich würde gerne wissen, wie man UNIX pipes verwenden kann. Es
gibt zwar die pipe() Funktion und so weiter, aber so richtig
schlau werde ich daraus nicht(auch nicht aus Apples
Dokumentation). Vielleicht kann mir ja hier jemand helfen.
Pipes sind recht einfach. Die pipe-Funktion schreibt in das als Parameter übergebene Array zwei Deskriptoren, und was man auf den zweiten schreibt, das kommt aus dem ersten raus (aber nicht umgekehrt, eine Pipe ist unidirektional).
Beispiel:
int pfds[2];
char\* test = "abcde";
char buffer[512];
if( pipe( pfds )
Pipes sind recht einfach. Die pipe-Funktion schreibt in das
als Parameter übergebene Array zwei Deskriptoren, und was man
auf den zweiten schreibt, das kommt aus dem ersten raus (aber
nicht umgekehrt, eine Pipe ist unidirektional).Beispiel:
int pfds[2];
char* test = „abcde“;
char buffer[512];if( pipe( pfds )
Soweit habe ich das jetzt verstanden, aber wie geht das zwischen zwei Programmen?
Dafür brauche ich das eigentlich.
Stichwort: IPC - Inter Process Communication
(google mal danach, und du wirst sehen, dass alleine die Ergebnisse auf der ersten Seite all deine Fragen beantworten, und noch mehr)
Fuer den Fall, dass du keinen Bock hast zu googlen, hier sind 3 Standardmöglichkeiten zur Kommunikation:
1.
einfachste Art zwischen Programmen zu kommunizieren ist stdin und stdout. Jedes Programm bekommt automatisch 3 filedescriptoren zugewiesen, 0=stdin zum Lesen von Daten, 1=stdout zum Schreiben von Daten und 2=stderr fuer Fehlermeldungen. Wenn ein Programm auf stdout schreibt und das andere auf stdin liest, kannst du diese Programme mit ner unix pipe verbinden:
$ programm1 | programm2
Und schon wird die Ausgabe von Programm 1 zur Eingabe von Programm 2.
Ne allgemeinere Art sind „Named Pipes“ (google mal danach!)
Sie haben den Vorteil, dass die beiden Programme getrennt aufgerufen werden koennen, und beide Programme ‚reden‘ miteinander über eine Pipe mit bestimmten Namen. Eine named pipe wird wie eine normale Datei behandelt (es ist ja letztlich auch eine Datei) und wird von beiden Prozessen geöffnet, waehrend der eine schreibt und der andere liest.
Noch allgemeiner sind Sockets. Die erlauben sogar IPC zwischen verschiedenen Rechnern, und sie erlauben full-duplex Kommunikation (named pipes sind meines Wissens nur half-duplex).
Diese 3 Moeglichkeiten unterscheiden sich programmiertechnisch eigentlich nur, wie die Kommunikation gestartet wird:
// Fall 1) fd = 0 oder 1; // stdin oder stdout, beide sind bereits offen.
// Fall 2) fd = open("NameOfPipe", ...);
// Fall 3) fd = socket(....); connect(fd, ...);
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]