Обработка SIGINT в медленных системных вызовах - PullRequest
1 голос
/ 09 сентября 2011

Я очень новичок в Python, так что простите, если этот вопрос очень простой.

Я пытаюсь обработать прерывание клавиатуры, принимая данные из сокета, используя модуль выбора. Итак, у меня есть вызов функции select.select () для ожидания данных из сокета и их вывода на консоль.

При нажатии CTRL_C кажется, что иногда я получаю ошибку select.error, а иногда исключение .IOError. Соответствующий код ошибки 4 для обоих исключений.

Существует некоторый код, который обрабатывает исключение KeyboardInterrupt глубже в стеке вызовов, поэтому, когда я получаю SIGINT в функции, где я принимаю соединение с сокетом, я просто хочу повторно вызвать исключение KeyboardInterrupt. Я также хочу отловить исключения, связанные с подключением.

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

Спасибо!

1 Ответ

1 голос
/ 09 сентября 2011

Используйте errno.EINTR вместо. Это безопасно.

>>> import errno
>>> errno.EINTR
4

Однако, это не скажет вам, какой сигнал прервал системный вызов, только то, что какой-то сигнал прервал его.

Из man 2 выберите :

EBADF  An  invalid file descriptor was given in one of the sets.  (Per‐
       haps a file descriptor that was already closed, or one on  which
       an error has occurred.)

EINTR  A signal was caught; see signal(7).

EINVAL nfds  is  negative  or  the  value  contained  within timeout is
       invalid.

ENOMEM unable to allocate memory for internal tables.
...