Перехват / блокировка 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

и процесс завершается полностью. Почему это происходит? Есть ли способ, которым я могу предотвратить воздействие прерывания на системный вызов?

Ответы на вопрос(2)

Ваш ответ на вопрос