ein Kapitel zurück                                           ein Kapitel weiter

Nun wollen wir uns als Problemstellung das Bild zuvor annehmen....




Zugegeben, das Problem löst in unserem Fall normalerweise der Druckerdämon lpd. Aber so fällt es einem leichter es sich vorzustellen. Nur verwenden wir in unserem Beipiel einen Drucker, da es wohl der Standard der meisten Leser sein wird. Und schließlich wollen sie das ja auch in der Praxis testen. Hier der Quellcode dazu...........

/*Download:fifo6.c*/
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define BUF 8192 void an_den_drucker(char *text) { FILE *p; /*Pipe zum Tool lpr erstellen zum Schreiben auf lpr*/ p=popen("lpr","w"); if(p == NULL) { fprintf(stderr,"Konnte keine Pipe zu \'lpr\' erstellen!!\n"); exit(0); } /*An den Drucker schreiben*/ printf("Sende Auftrag an den Drucker......\n"); fprintf(p, "%s", text); fflush(p); pclose(p); } int main() { char puffer[BUF], inhalt[BUF]; int fd,n; inhalt[0]='\0'; if(mkfifo("fifo1.1", O_RDWR) < 0) { fprintf(stderr,"Konnte keine FIFO erzeugen!!\n"); exit(0); } /*Empfänger ließt nur aus der FIFO*/ fd=open("fifo1.1", O_RDONLY); if(fd == -1) { perror("open : "); exit(0); } while(1) /*Endlosschleife*/ { if(n=read(fd,puffer,BUF)) an_den_drucker(puffer); sleep(2); } return 0; }

Ich nenne unser Programm 'polling'. Unser Programm läuft nun in einer Endlosschleife und liest etwas aus der FIFO, sofern dort etwas steht. Ansonsten wird 'polling' ja durch die Funktion read blockiert.

Unser Prgramm polling dient also als Empfänger oder auch Server wenn sie es so nenen wollen. Wir können unser Programm ja mal testen. Starten sie polling. Und nun schreiben wir von anderen Fenstern oder Terminals in die FIFO. Beispielsweise mittels....

echo hallo Welt > fifo1.1  

...aus wieder einem anderen Fenster oder Terminal....

cat datei.txt > fifo1.1  

Sie können das ganze aus beliebig (nicht ganz) vielen Fenstern und Terminals Nachrichten in die FIFO schreiben. Unser Programm polling ließt anschließend aus der FIFO, und leitet das gelesen mit Hilfe einer Pipe an den Drucker weiter.

Man könnte das ganze als eine Art Faxempfangsprogramm in einem lokalen Netzwerk sehen. Da nicht jeder mit der Shell vertraut ist wollen wir noch ein Programm schreiben, mit dem wir Daten an in dieser FIFO schreiben. Also das Sendeprogramm. Jeder der nun auf seinem Rechner diese Programm hat, kann auf die FIFO schreiben (sofern die Zugriffrechte richtig gesetzt sind).

In unserem Fall starten wir das Programm von verschieden Fenstern oder Terminals (Prozesse). Hier unser Programm mit dem wir eine Nachricht in die FIFO schreiben können......

/*Download:fifo7.c*/
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define BUF 8192 int main() { char puffer[BUF], inhalt[BUF]; int fd,n; inhalt[0]='\0'; /*Der Sender schreibt nur in die FIFO*/ fd=open("fifo1.1", O_WRONLY); if(fd == -1) { perror("open : "); exit(0); } printf("Bitte geben sie Ihre Nachricht ein (Mit STRG+D beenden)\n"); while(fgets(puffer,BUF,stdin) != NULL) strcat(inhalt,puffer); write(fd,inhalt,BUF); return 0; }

Nun können sie wieder in mehere Fenstern das Programm sender starten und alles in die FIFO schreiben. Unser Programm polling schickt die gelesenen Dateien anschließend an den Drucker weiter.

Nun haben wir unsere Problemstellung gelöst. Im nächsten Kapitel wollen wir uns ansehen wie wir es bewerkstelligen können, das unser Programm 'polling' jedem aufgerufenen 'sender'-Programm ein Nachricht schickt, das er seine Daten erhalten hat und ausgedruckt wurden.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf