Rohrsystemruf in C

Pipe System Call C



Rohr() ist eine Linux-Systemfunktion. Die Rohr() Die Systemfunktion wird verwendet, um Dateideskriptoren zu öffnen, die verwendet werden, um zwischen verschiedenen Linux-Prozessen zu kommunizieren. Kurz gesagt, die Rohr() -Funktion wird für die Kommunikation zwischen Prozessen unter Linux verwendet. In diesem Artikel zeige ich Ihnen, wie Sie die Systemfunktion pipe() unter Linux verwenden. Also lasst uns anfangen.

Die Syntax des Rohr() Funktion ist:







intRohr(intpipefd[2]);

Hier erzeugt die Funktion pipe() einen unidirektionalen Datenkanal für die Interprozesskommunikation. Sie gehen in ein int (Integer) Typ Array pipefd bestehend aus 2 Array-Elementen zur Funktion pipe(). Dann erstellt die Funktion pipe() zwei Dateideskriptoren im pipefd Array.



Das erste Element der pipefd Array, pipefd[0] wird zum Lesen von Daten aus der Pipe verwendet.



Das zweite Element des pipefd Array, pipefd[1] wird zum Schreiben von Daten in die Pipe verwendet.





Bei Erfolg gibt die Funktion pipe() 0 zurück. Wenn während der Initialisierung der Pipe ein Fehler auftritt, gibt die Funktion pipe() -1 zurück.

Die Funktion pipe() ist im Header definiert unistd.h . Um die Funktion pipe() in Ihrem C-Programm verwenden zu können, müssen Sie den Header einschließen unistd.h wie folgt:



#enthalten

Weitere Informationen zur Systemfunktion pipe() finden Sie in der Manpage von pipe() mit dem folgenden Befehl:

$ Mann2Rohr
Die Manpage von pipe().

Beispiel 1:

Erstellen Sie für das erste Beispiel eine neue C-Quelldatei 1_pipe.c und geben Sie die folgenden Codezeilen ein.

#enthalten
#enthalten
#enthalten

inthauptsächlich(Leere) {
intPfeifen[2];

wenn(Rohr(Pfeifen) == -1) {
Fehler ('Rohr');
Ausfahrt (EXIT_FAILURE);
}

druckenf ('Dateideskriptorwert lesen: %d ',Pfeifen[0]);
druckenf ('Dateideskriptorwert schreiben: %d ',Pfeifen[1]);

RückkehrEXIT_SUCCESS;
}

Hier habe ich die Header-Datei von pipe() eingefügt unistd.h zuerst mit der folgenden Zeile.

#enthalten

Dann im hauptsächlich() Funktion, ich habe die definiert Pfeifen zweielementiges Integer-Array mit der folgenden Zeile.

intPfeifen[2];

Dann habe ich die Funktion pipe() ausgeführt, um das Array der Dateideskriptoren zu initialisieren Pfeifen wie folgt.

Rohr(Pfeifen)

Ich habe auch mit dem Rückgabewert der Funktion pipe() auf Fehler überprüft. Ich habe das benutzt Ausfahrt() -Funktion, um das Programm zu beenden, falls die Pipe-Funktion fehlschlägt.

wenn(Rohr(Pfeifen) == -1) {
Fehler ('Rohr');
Ausfahrt (EXIT_FAILURE);
}

Dann habe ich den Wert der Read- und Write-Pipe-Dateideskriptoren ausgedruckt pipefds[0] und Pfeifen[1] bzw.

druckenf ('Dateideskriptorwert lesen: %d ',Pfeifen[0]);
druckenf ('Dateideskriptorwert schreiben: %d ',Pfeifen[1]);

Wenn Sie das Programm ausführen, sollten Sie die folgende Ausgabe sehen. Wie Sie sehen, ist der Wert des Read Pipe-Dateideskriptors pipefds[0] ist 3 und Pipe-Dateideskriptor schreiben Pfeifen[1] ist 4 .

Beispiel 2:

Erstellen Sie eine weitere C-Quelldatei 2_pipe.c und geben Sie die folgenden Codezeilen ein.

#enthalten
#enthalten
#enthalten
#enthalten

inthauptsächlich(Leere) {
intPfeifen[2];
verkohlenPuffer[5];

wenn(Rohr(Pfeifen) == -1) {
Fehler ('Rohr');
Ausfahrt (EXIT_FAILURE);
}

verkohlen *Stift= '4128 0';

druckenf ('PIN in Pipe schreiben... ');
schreiben(Pfeifen[1],Stift, 5);
druckenf ('Fertig. ');

druckenf ('Lese PIN aus Pipe... ');
lesen(Pfeifen[0],Puffer, 5);
druckenf ('Fertig. ');

druckenf ('PIN aus Pipe: %s ',Puffer);

RückkehrEXIT_SUCCESS;
}

Dieses Programm zeigt Ihnen im Wesentlichen, wie Sie in die Pipe schreiben und die Daten lesen, die Sie aus der Pipe geschrieben haben.

Hier habe ich einen 4-stelligen PIN-Code in a verkohlen Array. Die Länge des Arrays beträgt 5 (einschließlich des NULL-Zeichens ).

verkohlen *Stift= '4128 0';

Jedes ASCII-Zeichen ist in C 1 Byte groß. Um die 4-stellige PIN durch die Pipe zu senden, müssen Sie also 5 Byte (4 + 1 NULL-Zeichen) Daten in die Pipe schreiben.

Um 5 Byte Daten zu schreiben ( Stift ) in das Rohr, habe ich die schreiben() Funktion mit dem Write-Pipe-Dateideskriptor Pfeifen[1] wie folgt.

schreiben(Pfeifen[1],Stift, 5);

Da ich nun einige Daten in der Pipe habe, kann ich sie mit dem aus der Pipe auslesen lesen() Funktion für den Read-Pipe-Dateideskriptor pipefds[0] . Da ich 5 Byte Daten geschrieben habe ( Stift ) in die Pipe, werde ich auch 5 Byte Daten aus der Pipe lesen. Die gelesenen Daten werden im Puffer Zeichen-Array. Da ich 5 Byte Daten aus der Pipe lese, wird das Puffer Zeichenarray muss mindestens 5 Byte lang sein.

Ich habe die definiert Puffer Zeichenarray am Anfang des hauptsächlich() Funktion.

verkohlenPuffer[5];

Jetzt kann ich die PIN aus der Pfeife lesen und im Puffer Array mit der folgenden Zeile.

lesen(Pfeifen[0],Puffer, 5);

Nachdem ich nun die PIN aus der Pipe gelesen habe, kann ich sie mit dem ausdrucken printf() funktionieren wie gewohnt.

druckenf ('PIN aus Pipe: %s ',Puffer);

Sobald ich das Programm ausführe, wird die richtige Ausgabe angezeigt, wie Sie sehen können.

Beispiel 3:

Erstellen Sie eine neue C-Quelldatei 3_pipe.c als Typ in den folgenden Codezeilen.

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
inthauptsächlich(Leere) {
intPfeifen[2];
verkohlen *Stift;
verkohlenPuffer[5];

wenn(Rohr(Pfeifen) == -1) {
Fehler ('Rohr');
Ausfahrt (EXIT_FAILURE);
}

pid_t pid=Gabel();

wenn(pid== 0) { // im Kindprozess
Stift= '4821 0'; // PIN zum Senden
nah dran(Pfeifen[0]); // lese fd schließen
schreiben(Pfeifen[1],Stift, 5); // PIN in Pipe schreiben

druckenf ('PIN im Kind generieren und an Eltern senden... ');
Schlaf(2); // absichtliche Verzögerung
Ausfahrt (EXIT_SUCCESS);
}

wenn(pid> 0) { // im Hauptprozess
Warten(NULL); // warten, bis der untergeordnete Prozess abgeschlossen ist
nah dran(Pfeifen[1]); // schließe schreibe fd
lesen(Pfeifen[0],Puffer, 5); // PIN aus Pipe lesen
nah dran(Pfeifen[0]); // lese fd schließen

druckenf ('Elternteil hat PIN '%s' erhalten ',Puffer);
}

RückkehrEXIT_SUCCESS;
}

In diesem Beispiel habe ich Ihnen gezeigt, wie Sie Pipe für die prozessübergreifende Kommunikation verwenden. Ich habe über eine Pipe eine PIN vom untergeordneten Prozess an den übergeordneten Prozess gesendet. Anschließend die PIN aus der Pipe im übergeordneten Prozess ablesen und aus dem übergeordneten Prozess ausdrucken.

Zuerst habe ich einen untergeordneten Prozess mit der Funktion fork() erstellt.

pid_t pid=Gabel();

Dann im Kindprozess ( pid == 0 ), habe ich die PIN mit dem in die Pipe geschrieben schreiben() Funktion.

schreiben(Pfeifen[1],Stift, 5);

Sobald die PIN vom untergeordneten Prozess in die Pipe geschrieben wurde, wird der übergeordnete Prozess ( pid > 0 ) lesen Sie es aus der Pfeife mit der lesen() Funktion.

lesen(Pfeifen[0],Puffer, 5);

Dann druckte der übergeordnete Prozess die PIN mit printf() funktionieren wie gewohnt.

druckenf ('Elternteil hat PIN '%s' erhalten ',Puffer);

Wie Sie sehen können, liefert das Ausführen des Programms das erwartete Ergebnis.

Beispiel 4:

Erstellen Sie eine neue C-Quelldatei 4_pipe.c als Typ in den folgenden Codezeilen.

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

LeeregetPIN(verkohlenStift[PIN_LENGTH+ 1]) {
srand (getpid() +getppid());

Stift[0] = 49 + Reihe () % 7;

zum(intich= 1;ich<PIN_LENGTH;ich++) {
Stift[ich] = 48 + Reihe () % 7;
}

Stift[PIN_LENGTH] = ' 0';
}


inthauptsächlich(Leere) {
während(1) {
intPfeifen[2];
verkohlenStift[PIN_LENGTH+ 1];
verkohlenPuffer[PIN_LENGTH+ 1];

Rohr(Pfeifen);

pid_t pid=Gabel();

wenn(pid== 0) {
getPIN(Stift); // PIN generieren
nah dran(Pfeifen[0]); // lese fd schließen
schreiben(Pfeifen[1],Stift,PIN_LENGTH+ 1); // PIN in Pipe schreiben

druckenf ('PIN im Kind generieren und an Eltern senden... ');

Schlaf(PIN_WAIT_INTERVAL); // Verzögern der PIN-Generierung absichtlich.

Ausfahrt (EXIT_SUCCESS);
}

wenn(pid> 0) {
Warten(NULL); // warten bis das Kind fertig ist

nah dran(Pfeifen[1]); // schließe schreibe fd
lesen(Pfeifen[0],Puffer,PIN_LENGTH+ 1); // PIN aus Pipe lesen
nah dran(Pfeifen[0]); // lese fd schließen
druckenf ('Elternteil hat PIN '%s' vom Kind erhalten. ',Puffer);
}
}

RückkehrEXIT_SUCCESS;
}

Dieses Beispiel ist das gleiche wie Beispiel 3 . Der einzige Unterschied besteht darin, dass dieses Programm kontinuierlich einen Kindprozess erstellt, im Kindprozess eine PIN generiert und die PIN über eine Pipe an den Elternprozess sendet.

Der übergeordnete Prozess liest dann die PIN aus der Pipe und druckt sie aus.

Dieses Programm generiert alle PIN_WAIT_INTERVAL Sekunden eine neue PIN_LENGTH PIN.

Wie Sie sehen, funktioniert das Programm wie erwartet.

Sie können das Programm nur stoppen, indem Sie drücken + C .

So verwenden Sie den Systemaufruf pipe() in der Programmiersprache C. Danke, dass Sie diesen Artikel gelesen haben.