_pipe
Nach oben zu fcntl.h - Index
Header-Datei
io.h, fcntl.h
Kategorie
Eingabe-/Ausgaberoutinen
Syntax
int _pipe(int *handles, unsigned int size, int mode);
Beschreibung
Erstellt eine Pipe für Lese-/Schreiboperationen.
Die Funktion _pipe erstellt eine anonyme Pipe, die zum Datenaustausch zwischen Prozessen verwendet werden kann. Die Pipe wird zum Lesen und zum Schreiben geöffnet. Ähnlich wie bei einer Datei auf einem Datenträger kann aus einer Pipe gelesen und in eine Pipe geschrieben werden, im Gegensatz zu Datenträgerdateien ist ihr aber weder ein Name noch permanenter Speicher zugeordnet. In die Pipe geschriebene Daten existieren lediglich in einem vom Betriebssystem verwalteten Puffer im Speicher.
Das Lese-Handle wird an handles[0] und das Schreib-Handle an handles[1] zurückgegeben. Das Programm kann diese Handles in nachfolgenden Aufrufen der Funktionen read, write, dup, dup2 oder close verwenden. Wenn alle Pipe-Handles geschlossen sind, wird die Pipe gelöscht.
Die Größe des internen Pipe-Puffers wird durch size angegeben. Die empfohlene Mindestgröße beträgt 512 Bytes.
Der Übersetzungsmodus wird durch den Parameter mode festgelegt, der folgende Werte annehmen kann:
O_BINARY |
Die Pipe wird im Binärmodus geöffnet. |
O_TEXT |
Die Pipe wird im Textmodus geöffnet. |
Wenn mode Null (0) ist, wird der Übersetzungsmodus durch die externe Variable _fmode bestimmt.
Rückgabewert
Bei erfolgreicher Ausführung gibt _pipe den Rückgabewert 0 zurück und fügt die Pipe-Handles in handles[0] und handles[1] ein.
Andernfalls gibt die Funktion -1 zurück und weist errno einen der folgenden Werte zu:
EMFILE |
Too many open files (Zu viele Dateien geöffnet) |
ENOMEM |
Out of memory (Zu wenig Arbeitsspeicher) |
Beispiel
/*
Es folgen zwei kurze Programme. SEND startet einen untergeordneten
Prozess namens RECEIVE. Jedem Prozess ist ein Ende einer
Pipe zugeordnet. Der übergeordnete Prozesse sendet sein Befehlszeilenargument
an den untergeordneten Prozess, der den String ausgibt und dann beendet wird.
WICHTIG: Beim Linken des übergeordneten Prozesses muss die
Datei \32bit\fileinfo.obj eingebunden werden. Der in fileinfo.obj enthaltene Code ermöglicht dem
übergeordneten Prozess, mit einem untergeordneten Prozess gemeinsam Handles zu nutzen.
Ohne diese Zusatzinformationen kann der untergeordnete Prozess
das ihm übergebene Handle nicht nutzen.
*/
/* SEND */
#include <fcntl.h> // _pipe()
#include <io.h> // write()
#include <process.h> // spawnl() cwait()
#include <stdio.h> // puts() perror()
#include <stdlib.h> // itoa()
#include <string.h> // strlen()
#define DECIMAL_RADIX 10 // für atoi()
enum PIPE_HANDLES { IN, OUT }; // zur Indizierung des Handle-Arrays
int main(int argc, char* argv[])
{
int handles[2]; // ein- und
// ausgehende Pipe-Handles
char handleStr[10]; // Ein Handle,
// das als String gespeichert wird
int pid;
// System-ID des untergeordneten Prozesses
if (argc <= 1)
{
puts("No message to send.");
return(1);
}
if (_pipe(handles, 256, O_TEXT) != 0)
{
perror("Cannot create the pipe");
return(1);
}
// Handle als String speichern, der auf der Befehlszeile übergeben werden kann
itoa(handles[IN], handleStr, DECIMAL_RADIX);
// Untergeordneten Prozess erstellen und ihm das eingehende Pipe-Handle übergeben
spawnl(P_NOWAIT, "receive.exe", "receive.exe", handleStr, NULL);
// Meldung übertragen
write(handles[OUT], argv[1], strlen(argv[1])+1);
// Wenn die Pipe nicht mehr gebraucht wird, beide Handles schließen
close(handles[IN]);
close(handles[OUT]);
// Warten, bis untergeordneter Prozess beendet wird
wait(NULL);
return(0);
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |