POPEN(3)

BEZEICHNUNG
popen, pclose - bearbeite E/A

ÜBERSICHT
#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

BESCHREIBUNG
Die Funktion popen() öffnet einen Prozess dadurch, dass sie sich nach Erzeugen einer Pipe aufteilt und eine Shell öffnet. Da eine Pipe nach Definition unidirektional ist, darf das Argument type nur Lesen oder Schreiben angeben, nicht beides; der resultierende Datenkanal ist demzufolge nur-lesend oder nur-schreibend.

Das Argument command ist ein Zeiger auf einen mit NULL beendeten String, der ein Shell-Kommandozeile enthält. Dieses Kommando wird an -c -Flag an /bin/sh übergeben; Interpretation, falls nötig, wird von der Shell durchgeführt. Das Argument mode ist ein Zeiger auf einen mit NULL beendeten String, der entweder `r' für Lesen oder `w' für Schreiben sein muss.

Der Rückgabewert von popen() ist ein normaler Standard-E/A-Datenkanal in jeder Hinsicht, trotzdem muss er mit pclose() , nicht mit fclose() geschlossen werden. Schreiben in solch einen Datenkanal bewirkt Schreiben in die Standardeingabe des Kommandos; die Standardausgabe der Kommandos ist die des Prozesses, der popen(), aufgerufen hat, wenn dies nicht vom Programm selbst geändert wird. Umgekehrt lesen mit popen geöffnete Kanäle von der Standardausgabe des Programms während die die Standardeingabe dieselbe des aufrufenden Programms ist.

Beachten Sie, dass Ausgabe- popen()-Kanäle nach Voreinstellung voll gepuffert sind.

Die Funktion pclose() wartet bis der zugehörige Prozess beendet ist und gibt den Rückgabewert des Kommandos wie von wait4() geliefert, zurück.

RÜCKGABEWERT
Die Funktion popen() gibt NULL zurück wenn die Aufrufe fork(2) oder pipe(2) fehlschlagen, oder wenn kein Speicher belegt werden kann.

Die Funktion pclose() gibt -1 zurück wenn stream nicht mit einem durch ``popen'' erzeugten Datenkanal verbunden werden kann, wenn stream bereits mit ``pclose'' geschlossen wurde, oder wenn wait4 () einen Fehler zurückliefert.

FEHLER
Die Funktion popen() setzt errno nicht zuverlässig. (Gilt das unter Linux?)

BUGS
Da die zum Lesen geöffnete Standardeingabe eines Programms ihren Suchindex mit dem Prozess teilt, der popen() aufgerufen hat, kann es vorkommen, dass die Leseposition des Programms nicht wie erwartet ist, wenn der Originalprozess gepuffertes Schreiben durchgeführt hat. Genauso kann die Ausgabe eines zum Schreiben geöffneten Kommandos durcheinandergeraten mit dem Originalprozess. Letzteres kann vermieden werden durch Aufruf von fflush(3) vor popen().

Fehler, die Shell aufzurufen, kann nicht unterschieden werden von Fehler der Shell, das Programm aufzurufen, oder einem sofortigen Ende des Programms. Einziger Hinweis ist ein Rückgabewert von 127. (Gilt das unter Linux?)

Die Funktion popen() ruft immer sh, nicht csh auf.

GESCHICHTE
Funktionen() popen und pclose() erschienen in Version 7 AT&T UNIX.

SIEHE AUCH
fork(2), sh(1), pipe(2), wait4(2), fflush(3), fclose(3), fopen(3), stdio(3), system(3).