So verwenden Sie die Rohrfunktion in der C -Sprache

So verwenden Sie die Rohrfunktion in der C -Sprache

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 mit C -Sprache zu implementieren.

Über Rohr

In der Pipe werden die Daten in einer FIFO -Reihenfolge aufrechterhalten, was bedeutet, dass Daten nacheinander an ein Ende der Pipe schreiben und Daten von einem anderen Ende der Pipe in derselben Reihenfolge gelesen werden.

Wenn ein Prozess aus dem Rohr liest, aber kein anderer Vorgang noch nicht in die Pfeife geschrieben wurde, dann ist Read Returns am Ende der Datei zurück. Wenn ein Prozess in ein Rohr schreiben möchte, aber es gibt keinen anderen Vorgang zum Lesen an der Pipe, dann ist dies ein Fehlerbeding.

Header-Datei

#enthalten

Syntax

Int Pipe (int einreicht [2])

Argumente

Diese Funktion nimmt ein einzelnes Argument an, ein Array von zwei Ganzzahlen (Abstellungen). Abstellungen [0] wird zum Lesen aus der Pfeife verwendet und Abstellungen [1] wird zum Schreiben in die Pfeife verwendet. Der Vorgang, der aus dem Rohr lesen möchte, sollte schließen Abstellungen [1], und der Vorgang, der in die Pfeife schreiben möchte Abstellungen [0]. Wenn die unnötigen Enden des Rohrs nicht explizit geschlossen sind, wird das End-of-File (EOF) niemals zurückgegeben.

Rückgabewerte

Auf Erfolg die Rohr() Gibt 0 zurück, für den Fehler kehrt die Funktion -1 zurück.

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

Im Folgenden finden Sie einige Beispiele, in denen dargestellt wird, wie die Rohrfunktion in der C -Sprache verwendet wird.

Beispiel 1

In diesem Beispiel werden wir sehen, wie die Rohrfunktion funktioniert. Obwohl es nicht sehr nützlich ist, ein Rohr in einem einzigen Prozess zu verwenden, erhalten wir eine Idee, aber wir werden eine Idee bekommen.

// Beispiel 1.C
#enthalten
#enthalten
#enthalten
#enthalten
int main ()

int n;
int einreicht [2];
Zeichenpuffer [1025];
char *message = "Hallo, Welt!";
Rohr (Einreichung);
Schreiben (Einreichungen [1], Nachricht, Strlen (Nachricht));
if ((n = read (einreicht [0], Puffer, 1024))> = 0)
Puffer [n] = 0; // die Zeichenfolge beenden
printf (" %d Bytes aus dem Rohr:" %s "\ n", n, Puffer);

anders
perror ("read");
exit (0);

Hier haben wir zuerst ein Rohr mit Verwendung erstellt Rohr() Funktion dann mit der Pipe geschrieben mit verwendet Fildes [1] Ende. Dann wurden die Daten mit dem anderen Ende des Rohrs gelesen, nämlich Abstellungen [0]. Zum Lesen und Schreiben in die Datei haben wir früher lesen() Und schreiben() Funktionen.

Beispiel2

In diesem Beispiel werden wir sehen, wie Eltern- und Kinderprozesse mit der Rohr kommunizieren.

// Beispiel2.C
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
int main ()

int einreicht [2], nbytes;
PID_T Childpid;
char String [] = "Hallo, Welt!\N";
Char ReadBuffer [80];
Rohr (Einreichung);
if ((mildpid = fork ()) == -1)

Perror ("Gabel");
Ausgang (1);

if (mildpid == 0)

Schließen (Einreichungen [0]); // Kinderprozess benötigt dieses Ende des Rohrs nicht
/ * Sende "String" durch die Ausgangsseite der Rohr */
Write (einreicht [1], String, (Strlen (String) +1));
exit (0);

anders

/ * Übergeordneter Prozess schließt die Ausgangsseite der Pipe */
Schließen (Einreichungen [1]); // übergeordnete Prozess benötigt dieses Ende des Rohrs nicht
/ * In einer Zeichenfolge aus dem Rohr gelesen *//
nBytes = read (Einreichungen [0], ReadBuffer, sizeof (ReadBuffer));
printf ("Lesezeichenfolge: %s", ReadBuffer);

return (0);

Zunächst wurde ein Rohr mit der Rohrfunktion erstellt, dann wurde ein untergeordneter Prozess gegabelt. Dann schließt der Kinderprozess das Leseende und schreibt an die Pfeife. Der übergeordnete Prozess schließt das Schreibende und liest aus der Pipe und zeigt es an. Hier ist der Datenfluss nur ein Weg, der von Kind zu Eltern ist.

Abschluss:

Rohr() ist ein leistungsstarker Systemaufruf in Linux. In diesem Artikel haben wir nur einen Einweg-Datenfluss gesehen, ein Prozess schreibt und ein anderer Prozess liest sich und erstellt zwei Rohre, die wir auch bidirektionaler Datenfluss erreichen können.