Fangen / Blockieren von SIGINT während des Systemaufrufs

Ich habe einen Webcrawler geschrieben, den ich über die Tastatur anhalten möchte. Ich möchte nicht, dass das Programm abstirbt, wenn ich es unterbreche. Zuerst müssen die Daten auf die Festplatte geschrieben werden. Ich will auch nicht @ fangKeyboardInterruptedException, da sich die persistenten Daten möglicherweise in einem inkonsistenten Zustand befinden.

Meine aktuelle Lösung besteht darin, einen Signal-Handler zu definieren, der @ abfängSIGINT und setzt ein Flag; Jede Iteration der Hauptschleife überprüft dieses Flag, bevor die nächste URL verarbeitet wird.

Ich habe jedoch festgestellt, dass, wenn das System gerade ausgeführt wirdsocket.recv() Wenn ich den Interrupt sende, erhalte ich Folgendes:

^C
Interrupted; stopping...  // indicates my interrupt handler ran
Traceback (most recent call last):
  File "crawler_test.py", line 154, in <module>
    main()
  ...
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 397, in readline
    data = recv(1)
socket.error: [Errno 4] Interrupted system call

und der Prozess wird vollständig beendet. Warum passiert das? Kann ich verhindern, dass der Interrupt den Systemaufruf beeinflusst?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage