Pipes
-
Hallo zusammen,
ich hätte eine Frage zu UNIX Pipes. Und zwar möchte ich darüber zwei Prozesse kommunizieren lassen. In eine Richtung klappt das auch, z.B. wenn ich ./client > ./server aufrufe, und im client etwas auf den Standardausgabestrom schreibe und im server auf eben diesem lausche, bekommt der server die Nachricht vom client. Nun soll der server aber auch antworten und zwar so, dass es der client auch mitbekommt, nur das bekomme ich nicht hin
Hatte schon daran gedacht mit mkfifo zwei FIFO-Pipes zu erstellen, die eine vom client zum server und die andere umgekehrt, aber das klappt nicht so
Weiß jemand von euch, wie das geht?
Danke!!
Bisou
-
bisou schrieb:
ich hätte eine Frage zu UNIX Pipes. Und zwar möchte ich darüber zwei Prozesse kommunizieren lassen. In eine Richtung klappt das auch, z.B. wenn ich ./client > ./server aufrufe, und im client etwas auf den Standardausgabestrom schreibe und im server auf eben diesem lausche, bekommt der server die Nachricht vom client. Nun soll der server aber auch antworten und zwar so, dass es der client auch mitbekommt, nur das bekomme ich nicht hin
bei client|server kann nur server von client lesen
Hatte schon daran gedacht mit mkfifo zwei FIFO-Pipes zu erstellen, die eine vom client zum server und die andere umgekehrt, aber das klappt nicht so
am besten mal man 7 fifo lesen... vermutlich blockieren die sich bei dir, aber prinzipiell geht das.
Denke aber sockets wären da einfacher.
-
Mmmh
Das es prinzipiell geht, hatte ich mir schon gedacht, denn in eine Richtung funktioniert es ja. Nur mit welcher Syntax ich die Programme starten muss, da komme ich einfach nicht drauf
Falls jemand ne Idee hat, wäre ich echt happy
Danke!!
Bisou
-
Es gibt keine Shell-Syntax dafür. Du musst es selbst programmieren. Mit man 7 fifo wurde Dir eigentlich schon ein guter Hinweis mit einigen Verweisen auf passende Bibliotheksfunktionen geliefert.
-
Hier ist ein Beispielquelltext aus meinem Buch C und Linux, in dem das Programm "sort" als "Unterprogramm" aufgerufen wird und über zwei Pipes Daten in beide Richtungen mit "sort" ausgetauscht werden:
/* pipe2.c - Pipes als Standardein- und -ausgabe */ # include <stdio.h> # include <unistd.h> # include <sys/wait.h> int main() { int fd1[2], fd2[2], l; char buffer[80]; if ((pipe(fd1) != 0) || (pipe(fd2) != 0)) { perror("pipe2: pipe() failed"); return(1); } if (fork() == 0) { close(fd1[1]); /* Kind-Prozess */ close(fd2[0]); if ((dup2(fd1[0], STDIN_FILENO) == -1) || (dup2(fd2[1], STDOUT_FILENO) == -1)) { perror("pipe2: dup2() failed"); return(1); } close(fd1[0]); close(fd2[1]); execlp("sort", "sort", NULL); perror("pipe2: execlp() failed"); return(1); } close(fd1[0]); /* Eltern-Prozess */ close(fd2[1]); write(fd1[1], "These\nlines\nshall\nbe\nsorted\n", 28); close(fd1[1]); wait(NULL); if ((l = read(fd2[0], buffer, 79)) == -1) perror("pipe2: read() failed"); else write(STDOUT_FILENO, buffer, l); close(fd2[0]); return(0); }