Обработка SIGINT в медленных системных вызовах

1

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

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

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

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

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

Благодарю!

Теги:
sigint
system-calls
keyboardinterrupt

1 ответ

1
Лучший ответ

errno.EINTR этого используйте errno.EINTR. Это безопасно.

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

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

От человека 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.
  • 0
    Спасибо за ваш ответ. Пробую это сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню