|
![ein Kapitel weiter](../weiter.gif)
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 weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|