如果您不希望您的 C 扩展(或 ctypes DLL)与 Python 绑定,则有另一种方法可以解决此问题,例如您想要创建一个具有多种语言绑定的 C 库的情况,您必须允许您的C 扩展运行长时间,您可以修改 C 扩展:
在 C 扩展中包含信号头。
#include <signal.h>
在 C 扩展中创建信号处理程序 typedef。
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 将执行您期望的操作,例如为 SIGINT 引发 KeyboardInterrupt。