Вы используете alarm()
, который отправляет сигнал, и pyserial, который выполняет чтение и запись в последовательный порт. Когда вы читаете или пишете на подобное устройство и принимается сигнал SIGALRM
, вызов read()
или write()
прерывается, поэтому сигнал может быть обработан.
Поскольку сигналы обрабатываются в пространстве пользователя, а чтение и запись фактически обрабатываются ядром, это делает вещи довольно уродливыми. Это известный способ обработки сигналов, который восходит к самым ранним дням UNIX.
Код, который правильно обрабатывает сигналы в python, может выглядеть следующим образом:
import errno
while True:
try:
data = read_operation()
except OSError, e:
if getattr(e, 'errno', errno.EINTR):
continue
raise
else:
break