popen(3S) popen(3S)
NAME
popen, pclose - Pipe zu Kommando öffnen/schließen
SYNTAX
#include <stdio.h>
FILE *popen(const char *Kommando, const char *Modus);
int pclose(FILE *Stream);
BESCHREIBUNG
popen() erzeugt eine Pipe zwischen dem aufrufenden Programm und dem
auszuführenden Kommando. Die Argumente von popen() sind Zeiger auf mit
Null-Byte endende Zeichenketten. Kommando besteht aus einer Shell-
Kommandozeile. Modus ist ein E/A-Modus, d. h. entweder r für Lesen
oder w für Schreiben. Bei dem zurückgegebenen Wert handelt es sich um
einen Dateizeiger, so daß man im E/A-Modus w auf die Standardeingabe
des Kommandos schreiben kann, indem man in die Datei Stream schreibt;
und man kann von der Standardausgabe des Kommandos lesen, wenn der
E/A-Modus r ist, indem man von der Datei Stream liest.
Eine durch popen() geöffnete Pipe sollte mit pclose() geschlossen wer-
den, das auf die Beendigung des zugehörigen Prozesses wartet und den
Ende-Status des Kommandos zurückgibt.
Da offene Dateien mehrfach benutzt werden, kann ein Kommando des Typs
r als Eingabefilter und ein Typ w als Ausgabefilter verwendet werden.
Das Verhalten von popen() ist nur definiert für die Werte r bzw. w von
Modus. Andere Werte, wie rb oder wb können von speziellen Implementie-
rungen unterstützt werden, stellen jedoch keine portablen Konstrukte
dar. Beachten Sie, daß frühere Implementierungen von popen() nur prü-
fen, ob das erste Zeichen von Modus ein r ist. Damit wird eine Angabe
für Modus wie "robert the robot" wie der Lesemodus r behandelt, jedoch
ein Modus wie "anything else" als Schreibmodus w angesehen.
BEISPIELE
#include <stdio.h>
#include <stdlib.h>
main()
{
char *cmd = "/usr/bin/ls *.c";
char buf[BUFSIZ];
FILE *ptr;
if ((ptr = popen(cmd, "r")) != NULL)
while (fgets(buf, BUFSIZ, ptr) != NULL)
(void) printf("%s", buf);
return 0;
}
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
popen(3S) popen(3S)
Dieses Programm schreibt alle Dateinamen im aktuellen Dateiverzeich-
nis, die auf .c enden, auf die Standardausgabe [siehe stdio(3S)].
ERGEBNIS
popen() gibt einen Nullzeiger zurück, wenn keine Dateien oder Prozesse
erzeugt werden können.
pclose() gibt -1 zurück, wenn Stream nicht mit popen() geöffnet wurde.
HINWEISE
Wenn der Originalprozeß und der durch popen() erzeugte Prozeß gleich-
zeitig eine gemeinsame Datei lesen oder beschreiben, darf keiner der
Prozesse gepufferte E/A verwenden. Probleme mit einem Ausgabefilter
können durch sorgfältiges Entleeren des Puffers, z. B. mit fflush()
[siehe fclose(3S)] vermieden werden.
Durch die Umgebungsvariablen IFS und PATH können Sicherheitsprobleme
entstehen. Verwenden Sie vollständige Pfadnamen oder setzen Sie PATH
zurück, und setzen Sie IFS auf Leerzeichen und Tabulator "\t".
SIEHE AUCH
pipe(2), wait(2), fclose(3S), fopen(3S), stdio(3S), system(3S).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98