Announcement

Collapse
No announcement yet.

Prozesse starten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prozesse starten

    Kennt jemand einen Weg, einen Prozess aus einer Anwendung heraus zu starten, ohne die laufende Anwendung zu beenden? Alle Systemaufrufe zum Starten einer Anwendung scheinen die aktuelle Anwendung zu beenden. Ich habe mir daher bisher damit beholfen, die aktuelle anwendung zu forken, um dann im Kindprozess den Aufruf der neuen Anwendung zu tätigen. Das scheint mir aber gerade bei umfangreichen Anwendungen nicht besonders sinnvoll. Schließlich erstellt ein fork eine exakte Kopie des laufenden Prozesses.

  • #2
    Das ist aber unter Unix die korrekte Vorgehensweise. Und auch nicht so schlimm, da moderne Unix-Systeme mit copy-on-write arbeiten. Das bedeutet, dass fuer den Kind-Prozess erst dann eine eigene Kopie einer Speicher-Seite angelegt wird, wenn an dieser Seite eine Aenderung vorgenommen wird. Damit ist der Resourcenverbrauch vernachlaessigbar.

    cu
    Mei

    Comment


    • #3
      Oki!<br>
      Besten Dank

      Comment


      • #4
        Ja, diese Möglichkeit gibt es - und zwar mit Hilfe der C-Funktion <i>popen()</i>. Der Prototyp befindet sich in der Headerdatei <i>#include <stdio.h></i>:
        <PRE>
        FILE *popen(const char *command, const char *type);
        </PRE>
        Die Funktion startet einen Prozeß und öffnet eine Pipe (eine Pipe ist der Definition nach unidirektional, d.h. das Argument <i>type</i> darf nur 'Lesen' oder 'Schreiben' festlegen).
        Das Argument <i>command</i> ist ein Pointer auf einen String (NULL terminiert), der einen Shell-Befehl enthält. Soweit, so gut.

        Der Rückgabewert von <i>popen()</i> ist bei C ein herkömmlicher Standard-IO Kanal. Dieser muß mit <i>pclose()</i> (und nicht mit <i>fclose()</i>) geschlossen werden.

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

        Im <i>os</i>-Modul der Sprache Python findet sich die <i>popen()</i>-Funktion ebenfalls. Der Umgang ist im Vergleich zur C-Funktion anwender-freundlicher;-). Hier das Aufruf-Schema:
        <PRE>
        popen(command [, mode='r' [, bufsize]]) -> pipe
        </PRE>
        Auch hier wird, wie beim C-Pendant, 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 in Python ist sehr effektiv; Sie können praktisch jede Methode nutzen, die Sie auch bei der Arbeit mit normalen Dateien verwenden. Ein einfaches Beispiel demonstriert abschließend den einfachen Umgang mit <i>os.popen()</i>:
        <PRE>
        #!/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,
        </PRE>
        Das Beispiel listet alle Dateien des aktuellen Verzeichnisses auf; backup files werden dabei nicht berücksichtigt, dafür sorgt folgende Zeile:
        <PRE>
        if '~' in line:
        continue
        </PRE>

        Apropos: falls Sie HIlfe für eine bestimmte Python-Funktion benötigen, können Sie das so bewerkstelligen: <i>pydoc os.popen</i>.

        Viel Spass.

        Thomas Kaufman

        Comment

        Working...
        X