Существует альтернативный способ решения этой проблемы, если вы не хотите, чтобы ваше расширение C (или ctypes DLL) было привязано к Python, например, в случае, когда вы хотите создать библиотеку C с привязками на нескольких языках, вы должны разрешить Расширение C для работы в течение длительного времени, и вы можете изменить расширение C:
Включите заголовок сигнала в расширение C.
#include <signal.h>
Создайте typedef обработчика сигнала в расширении C.
typedef void (*sighandler_t)(int);
Добавьте обработчики сигналов в расширение C, которые будут выполнять действия, необходимые для прерывания любого продолжительного кода (установить флаг остановки и т. Д.), И сохранить существующие обработчики сигналов Python.
sighandler_t old_sig_int_handler = signal(SIGINT, your_sig_handler);
sighandler_t old_sig_term_handler = signal(SIGTERM, your_sig_handler);
Восстанавливайте существующие обработчики сигналов всякий раз, когда возвращается расширение C. Этот шаг обеспечивает повторное применение обработчиков сигналов Python.
signal(SIGINT, old_sig_int_handler);
signal(SIGTERM, old_sig_term_handler);
Если длительный код прерывается (флаг и т. Д.), Верните управление Python с кодом возврата, указывающим номер сигнала.
return SIGINT;
В Python отправьте сигнал, полученный в расширении C.
import os
import signal
status = c_extension.run()
if status in [signal.SIGINT, signal.SIGTERM]:
os.kill(os.getpid(), status)
Python выполнит ожидаемое действие, например вызовет KeyboardInterrupt для SIGINT.
person
Tom N.
schedule
03.11.2018