C-Programmierung

So verwenden Sie die Pipe-Funktion in der Sprache C

So verwenden Sie die Pipe-Funktion in der Sprache C

Ein Rohr ist ein Medium für die Kommunikation zwischen Prozessen. Ein Prozess schreibt Daten in die Pipe und ein anderer Prozess liest die Daten aus der Pipe. In diesem Artikel werden wir sehen, wie die Funktion pipe() verwendet wird, um das Konzept in der Sprache C zu implementieren.

Über Rohr

In der Pipe werden die Daten in einer FIFO-Reihenfolge gehalten, was bedeutet, dass Daten sequentiell an ein Ende der Pipe geschrieben und Daten von einem anderen Ende der Pipe in derselben sequentiellen Reihenfolge gelesen werden.

Wenn ein Prozess aus der Pipe liest, aber noch kein anderer Prozess in die Pipe geschrieben hat, dann gibt read das Dateiende zurück. Wenn ein Prozess in eine Pipe schreiben möchte, aber kein anderer Prozess zum Lesen an die Pipe angehängt ist, dann ist dies ein Fehlerzustand und die Pipe erzeugt ein SIGPIPE-Signal.

Header-Datei

#einschließen

Syntax

int-Pfeife (int filedes[2])

Argumente

Diese Funktion benötigt ein einzelnes Argument, ein Array von zwei ganzen Zahlen (filedes). filedes[0] wird zum Lesen aus der Pfeife verwendet, und dateien[1] wird zum Schreiben auf die Pfeife verwendet. Der Prozess, der aus der Pipe lesen möchte, sollte sich schließen dateien[1], und der Prozess, der in die Pipe schreiben möchte, sollte geschlossen werden filedes[0].  Wenn die unnötigen Enden der Pipe nicht explizit geschlossen werden, wird nie end-of-file(EOF) zurückgegeben.

Rückgabewerte

Bei Erfolg, die Rohr() gibt 0 zurück, bei einem Fehler gibt die Funktion -1 . zurück.

Bildlich können wir die Rohr() Funktion wie folgt:

Nachfolgend finden Sie einige Beispiele, die zeigen, wie die Pipe-Funktion in der Sprache C verwendet wird.

Beispiel 1

In diesem Beispiel sehen wir, wie die Pipe-Funktion funktioniert. Es ist zwar nicht sehr sinnvoll, ein Rohr in einem einzigen Prozess zu verwenden, aber wir werden eine Idee haben.

// Beispiel 1.c
#einschließen
#einschließen
#einschließen
#einschließen
int main()

int n;
int-filedes[2];
Zeichenpuffer[1025];
char *message = "Hallo Welt!";
Rohr(filedes);
write(filedes[1], Nachricht, Strlen(Nachricht));
if ((n = lesen ( filedes[0], buffer, 1024 ) ) >= 0)
Puffer[n] = 0; //beende die Zeichenfolge
printf("lese %d Bytes aus der Pipe: "%s"\n", n, Puffer);

sonst
perror("lesen");
Ausgang (0);

Hier haben wir zuerst eine Pfeife erstellt mit Rohr() Funktion dann mit in die Pipe geschrieben fildes[1] Ende. Dann wurden die Daten mit dem anderen Ende der Pipe gelesen, das ist filedes[0]. Zum Lesen und Schreiben in die Datei haben wir früher lesen() und schreiben() Funktionen.

Beispiel2

In diesem Beispiel sehen wir, wie Parent- und Child-Prozesse über die Pipe kommunizieren.

// Beispiel2.c
#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
int main()

int filedes[2], nbytes;
pid_t childpid;
char string[] = "Hallo Welt!\n";
char-Lesepuffer[80];
Rohr(filedes);
if((childpid = fork()) == -1)

perror("Gabel");
Ausgang(1);

if(Kindpid == 0)

close(filedes[0]); // Untergeordneter Prozess benötigt dieses Ende der Pipe nicht
/* "String" über die Ausgabeseite der Pipe senden */
write(filedes[1], string, (strlen(string)+1));
Ausgang (0);

sonst

/* Der übergeordnete Prozess schließt die Ausgabeseite der Pipe */
close(filedes[1]); //Der übergeordnete Prozess benötigt dieses Ende der Pipe nicht
/* Einen String aus der Pipe einlesen */
nbytes = read(filedes[0], readbuffer, sizeof(readbuffer));
printf("String lesen: %s", Lesepuffer);

zurück(0);

Zuerst wurde eine Pipe mit der Pipe-Funktion erstellt, dann wurde ein untergeordneter Prozess gegabelt. Dann schließt der Kindprozess das Leseende und schreibt in die Pipe. Der übergeordnete Prozess schließt das Schreibende und liest aus der Pipe und zeigt sie an. Hier ist der Datenfluss nur ein Weg, der vom Kind zu den Eltern führt.

Fazit:

Rohr() ist ein mächtiger Systemaufruf in Linux. In diesem Artikel haben wir nur einen unidirektionalen Datenfluss gesehen, einen Prozess schreibt und ein anderer Prozess liest, wodurch zwei Pipes erstellt werden, mit denen wir auch einen bidirektionalen Datenfluss erreichen können.

Weisen Sie Ihre Maustasten mit der X-Mouse Button Control für verschiedene Software unterschiedlich zu
Vielleicht benötigen Sie ein Tool, mit dem sich die Steuerung Ihrer Maus bei jeder von Ihnen verwendeten Anwendung ändern kann. In diesem Fall können ...
Microsoft Sculpt Touch Wireless-Maus Bewertung
Ich habe vor kurzem gelesen, dass Microsoft Sculpt Touch kabellose Maus und beschloss, sie zu kaufen. Nachdem ich es eine Weile benutzt hatte, beschlo...
AppyMouse On-Screen Trackpad und Mauszeiger für Windows Tablets
Tablet-Benutzer vermissen oft den Mauszeiger, insbesondere wenn sie die Laptops gewohnt sind. Die Touchscreen-Smartphones und -Tablets bieten viele Vo...