_pipe

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

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++

+