Seite 1 von 1

Signal und Systemaufrufe

Verfasst: Dienstag 21. September 2010, 19:39
von Otto
Hallo,

ich will bei meine Script CTRL-C Abfangen. Das bekomme ich mit einem Signalhandler auch problemlos hin, aber sobald ich mit os.system() ein anderen Prozess ausführe, kann ich das Signale nicht mehr abfangen. Sie werden alle an den neuen Prozess weitergeleitet.

Code: Alles auswählen

#! /usr/bin/python

import sys
import signal
import os
import time

def handler(signum, fame):
    print("exit")
    sys.exit()

signal.signal(signal.SIGINT, handler)

os.system("sleep 10 && echo bash")
print "python"
time.sleep(10)
print "ende"
Wenn ich 2 mal Ctrl-C drücke bekomme ich:

Code: Alles auswählen

^Cpython
^Cexit
Hat jemand ein Tipp wie ich das Signal auch abfangen kann?

P.s. Als Betriebsystem verwende ich Linux

Re: Signal und Systemaufrufe

Verfasst: Dienstag 21. September 2010, 21:37
von Dauerbaustelle
Ctrl+C wirft einen `KeyboardInterrupt`. Den kannst du einfach abfangen.

Re: Signal und Systemaufrufe

Verfasst: Dienstag 21. September 2010, 21:56
von Otto
Dauerbaustelle hat geschrieben:Ctrl+C wirft einen `KeyboardInterrupt`.
Bei einem Systemaufruf wird keine KeyboardInterrupt geworfen! Sondern das Signal wird an den anderen Prozess(vom Systemaufruf) weiter geschickt.

Re: Signal und Systemaufrufe

Verfasst: Dienstag 21. September 2010, 22:12
von lunar
@Otto: Ich bin mir nicht sicher, dass sich das verhindern lässt, da der Kindprozess die Signalhandler des Vaters überschreiben kann, und zudem zum Vordergrundprozess wird, also das Terminal und somit auch den Keyboardinterrupt vor dem Vaterprozess sieht.

Noch eine Anmerkung zur Terminologie: Der Begriff "Systemaufruf" hat im Allgemeinen eine andere Bedeutung. Beim Start vom Programmen spricht man eher von Unterprozessen.

Unabhängig davon solltest Du "system()" durch die Funktion aus dem Modul "subprocess" ersetzen.

Re: Signal und Systemaufrufe

Verfasst: Mittwoch 22. September 2010, 20:03
von Otto
Nach dem ersetzen von os.system() durch subprocess.call(), kann ich das Signal abfangen.

Leider wird weder in der Doku zum subprocess Modul noch im PEP 324 das Verhalten beschrieben.

Re: Signal und Systemaufrufe

Verfasst: Samstag 25. September 2010, 19:11
von lunar
@Otto: Dieses „Verhalten“ hat mit subprocess nichts zu tun, und ist insofern selbstverständlich nicht im PEP oder in der Dokumentation beschrieben, zumal es auch gar kein allgemeines „Verhalten“ gibt.

Das Verhalten hängt vom gestarteten Unterprozess ab, und von der Sitzungsverwaltung der Shell. Eine gute Einführung in die Zusammenhänge liefert der Artikel TTY demystified.

Re: Signal und Systemaufrufe

Verfasst: Samstag 25. September 2010, 19:37
von birkenfeld
lunar hat geschrieben:@Otto: Dieses „Verhalten“ hat mit subprocess nichts zu tun, und ist insofern selbstverständlich nicht im PEP oder in der Dokumentation beschrieben, zumal es auch gar kein allgemeines „Verhalten“ gibt.
Das stimmt insofern, dass es eher mit os.system() zu tun hat, das nichts anderes macht, als die system()-Funktion aus der C-Library aufruft. Und in der manpage dazu steht bei mir:
system(3) hat geschrieben:During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
subprocess nimmt statt dessen os.exec*(), was dieses Verhalten nicht hat.

Re: Signal und Systemaufrufe

Verfasst: Samstag 25. September 2010, 19:49
von lunar
@birkenfeld: Danke für die Korrektur.