Pipe

Willemers Informatik-Ecke

Unter UNIX ist die Pipe (engl. Röhre) ein Standardmittel zur Verknüpfung zweier Prozesse. Dabei führt der eine Prozess seine Standardausgabe dem Nachfolger als Standardeingabe zu.

Prozesskommunikation per Pipe

Eine Pipe kann man sich also wie eine Datei mit zwei Enden vorstellen, die eine Richtung hat. Der eine Prozess kann nur schreiben, während der andere nur liest.

#include <unistd.h>

int pipe(int zipfel[2]);

Es werden zwei Dateihandles erzeugt, die man nach dem Aufruf in dem Parameter zipfel findet. zipfel[0] enthält das Ende zum Lesen und zipfel[1] enthält das Ende zum Schreiben in die Pipe. Als nächstes erfolgt typischerweise ein Aufruf von fork(). Dann übernimmt der Vater das eine und das Kind das andere Ende der Pipe und schließt das jeweils andere, je nach dem, wer von beiden Datenproduzent und wer Datenkonsument ist. Der Produzent benutzt den normalen write() und der Konsument den normalen read(). Beide Enden der Pipe müssen separat per close() geschlossen werden.

Named Pipe oder FIFO

Unter UNIX kann man auch eine FIFO-Datei anlegen. Man spricht hier auch von der >>named pipe<<, da man sie über ihren Dateinamen ansprechen kann. FIFO ist die Abkürzung für First In First Out, lapidar übersetzt mit >>wer zuerst kommt, mahlt zuerst<<. Alle Arten von Puffern sind FIFOs. Auch die FIFO hat einen Datenproduzenten, der nur in den FIFO hineinschreibt und einen Konsumenten, der nur liest.

#include <sys/types.h>
#include <sys/stat.h>

int mkfifo ( const char *Name, mode_t modus );

Drucken unter UNIX

Während bei Personal-Computern für das Drucken eine Pseudodatei eröffnet wird und dort hineingeschrieben wird, ist dieser Ansatz unter UNIX nicht realisierbar. Zwar gibt es auch hier eine Datei, die dem Drucker zugeordnet ist (/dev/lp), aber diese ist aus gutem Grund den normalen Benutzern nicht zugänglich. Man möchte vermeiden, dass ein Benutzer einem anderen in den Ausdruck hineinrauscht. Als UNIX-Anwender kennt man dies. Um dort seine Texte auf Papier zu bannen, wird man nicht die Ausgabe auf das Device umleiten, sondern eine Pipe zum Progamm lp oder lpr aufbauen. Genauso geht man vom Programm aus vor, man eröffnet eine Pipe.

print(char *Inhalt)
{
FILE *PipeID;

    PipeID = popen("lpr", "w");
    fwrite(Inhalt, strlen(Inhalt), 1, PipeID);
    pclose(PipeID);
}

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing


Homepage (C) Copyright 2002 Arnold Willemer