Я использую расширение c в своем коде python, который предоставляет три функции:
mycext.setup() # creates multiple c-threads
try:
while True:
sleep(1)
mycext.dosmth()
except KeyboardInterrupt:
print("Keyboard Interrupt, stopping!")
finally:
mycext.close() # joins the c-threads
В коде библиотеки c, я вижу это:
sigemptyset(&sioset);
sigaddset(&sioset, SIGIO);
sigaddset(&sioset, SIGINT);
sigaddset(&sioset, SIGTERM);
action.sa_flags = 0;
pthread_sigmask(SIG_BLOCK, &sioset, NULL);
sigemptyset(&sioset);
sigaddset(&sioset, SIGINT);
pthread_sigmask(SIG_UNBLOCK, &sioset, NULL);
sigemptyset(&action.sa_mask);
action.sa_handler = int_handler;
sigaction(SIGINT, &action, NULL);
pthread_mutex_init(&read_mmx, NULL);
pthread_cond_init(&read_cond, NULL);
Теперь, когда я нажимаю Ctrl + c, потоки, созданные расширением c, закрываются, а затем все зависает, пока я не использую SIGKILL
.
Я понимаю, что каким-то образом расширение c обрабатывает SIGINT и никогда не находит путь к интерпретатору python, что означает, что KeyboardInterrupt не зарегистрировано. Мой вопрос был бы: нужно ли расширению c каким-то образом передавать сигнал (например, вызывая PyErr_SetInterrupt()
даже если я понимаю, что в этом нет необходимости) или не стоит с ним справиться?
РЕДАКТИРОВАТЬ 1 : Хорошо, я думаю, что расширение c не должно использовать sigaction
для установки нового обработчика, поскольку оно будет перезаписывать все, что python поместит туда изначально ... правильный? Какой лучший способ справиться с ситуацией?