Samstag, 11. Oktober 2008

entwickler.com Magazine Konferenzen Entwickler Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag

Prozesse mit popen() starten

Frage: Kennt jemand einen Weg, einen Prozess aus einer Anwendung heraus zu starten, ohne die laufende Anwendung zu beenden?

Antwort: Ja, diese Möglichkeit gibt es - und zwar mit Hilfe der C-Funktion popen(). Der Prototyp befindet sich in der Headerdatei stdio.h:


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

Die Funktion startet einen Prozeß und öffnet eine Pipe (eine Pipe ist unidirektional, d.h. das Argument type darf nur 'Lesen' oder 'Schreiben' festlegen). Das Argument command ist ein Pointer auf einen String (NULL terminiert), der einen Shell-Befehl enthält.

Der Rückgabewert von popen() ist in C ein herkömmlicher Standard-IO Kanal. Dieser muß mit pclose(), nicht etwa mit fclose(), geschlossen werden.

Das Schreiben in den Datenkanal bewirkt praktisch das Schreiben in die Standardeingabe eines Kommandos, während die Standardausgabe eines Kommandos gleichzeitig die Ausgabe des aufgerufenen Prozesses ist. Falls Sie mehr wissen möchten: der Aufruf man popen liefert ausführliche Informationen.

Im os-Modul der Sprache Python findet sich die popen()-Funktion ebenfalls. Der Umgang ist im Vergleich zur C-Funktion aber einfacher. Hier das Aufruf-Schema:

popen(command [, mode='r' [, bufsize]]) -> pipe

Auch hier wird, wie bei C, eine Pipe geöffnet und ein File-Object zurückgeliefert. Im Prinzip ist die Python-Funktion nur ein Wrapper um die zugrundeliegende C-Funktion. Die Arbeit mit File-Objekten ist in Python sehr effektiv - d.h. Sie können jede Methode nutzen, die Sie bei der Arbeit mit normalen Dateien verwenden. Ein einfaches Beispiel demonstriert den Umgang mit os.popen():

#!/usr/bin/env python

import os

if __name__ == '__main__':

com = 'ls -laHt'
FP = os.popen(com)
for line in FP:
if '~' in line:
continue
else:
print line,

Das Beispiel listet alle Dateien des aktuellen Verzeichnisses auf; backup files werden dabei nicht berücksichtigt, dafür sorgt folgende Zeile:

if '~' in line: continue

Tipp: Falls Sie ad-hoc Hilfe für ein Python-Konstrukt benötigen, können Sie das so bewerkstelligen:

pydoc os.popen

Viel Spass.

Thomas Kaufmann




Software & Support Verlag GmbH