Перехват / блокировка SIGINT во время системного вызова
Я написал веб-сканер, который я бы хотел остановить с помощью клавиатуры. Я не хочу, чтобы программа умерла, когда я ее прерываю; сначала необходимо сбросить данные на диск. Я тоже не хочу ловитьKeyboardInterruptedException
потому что постоянные данные могут быть в несовместимом состоянии.
Мое текущее решение состоит в том, чтобы определить обработчик сигнала, который ловитSIGINT
и устанавливает флаг; каждая итерация основного цикла проверяет этот флаг перед обработкой следующего URL.
Тем не менее, я обнаружил, что если система работаетsocket.recv()
когда я посылаю прерывание, я получаю это:
^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
и процесс завершается полностью. Почему это происходит? Есть ли способ, которым я могу предотвратить воздействие прерывания на системный вызов?