1. Funktionsbeschreibung
Pipe (Pipeline erstellen):
1) Header-Datei #include
2) Funktion definieren: int pipe(int filedes[2]) ;
3) Funktionsbeschreibung: pipe() richtet eine Pipeline ein und gibt den Dateideskriptor aus dem Parameter-Filedes-Array zurück.
Filedes [0] ist das lesende Ende der Pipeline.
Filedes [1] ist das schreibende Ende der Pipeline.
4) Rückgabewert: Bei Erfolg Null zurückgeben, andernfalls -1 zurückgeben, und die Fehlerursache wird in errno gespeichert.
Fehlercode:
EMFILE Der Prozess hat die maximale Anzahl an Dateideskriptoren erschöpft
ENFILE Im System sind keine Dateideskriptoren verfügbar.
EFAULT-Parameterdatei-Array-Adresse ist unzulässig.
2. Beispiel
#include <unistd.h> #include <stdio.h> int main( void ) { int filedes[2]; char buf[80]; pid_t pid; pipe( filedes ); pid=fork(); if (pid > 0) { printf( "This is in the father process,here write a string to the pipe.\n" ); char s[] = "Hello world , this is write by pipe.\n"; write( filedes[1], s, sizeof(s) ); close( filedes[0] ); close( filedes[1] ); } else if(pid == 0) { printf( "This is in the child process,here read a string from the pipe.\n" ); read( filedes[0], buf, sizeof(buf) ); printf( "%s\n", buf ); close( filedes[0] ); close( filedes[1] ); } waitpid( pid, NULL, 0 ); return 0; }
Ergebnis ausführen:
[root@localhost src]# gcc pipe.c
[root@ localhost src]# ./a.out
Dies ist im untergeordneten Prozess, hier wird eine Zeichenfolge aus der Pipe gelesen.
Dies ist im Vaterprozess, hier wird eine Zeichenfolge in die Pipe geschrieben.
Hallo Welt , das ist das Schreiben per Pipe.
Wenn die Daten in der Pipe gelesen werden, ist die Pipe leer. Ein nachfolgender read()-Aufruf blockiert standardmäßig und wartet darauf, dass einige Daten geschrieben werden.
Wenn Sie es auf nicht blockierend einstellen müssen, können Sie die folgenden Einstellungen vornehmen:
fcntl(fileds[0], F_SETFL, O_NONBLOCK);