【发布时间】:2015-11-05 18:45:14
【问题描述】:
我想从 C 扩展中引发 KeyboardInterrupt。
在 C 中,我通过下面的 + setup.py 创建了一个名为 siginfo 的模块:
static void siginfo_handler(int signum, siginfo_t *siginfo, void *context) {
printf("got signal from '%d'", siginfo->si_pid);
//raise(PyExc_KeyboardInterrupt) <--- i want to raise keyboard interrupt here
}
static PyObject * siginfo_register(PyObject *self, PyObject *args) {
struct sigaction act;
memset(&act, '\0', sizeof(act));
act.sa_sigaction = &siginfo_handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGINT, &act, NULL);
PY_RETURN_NONE;
}
static PyMethodDef SiginfoMethods[] = {
//blah blah filled out
};
PyMODINIT_FUNC initsiginfo(void) {
//blah blah filled out
}
在 Python 中:
import siginfo
import os
siginfo.register()
print "talk to me with kill -SIGINT %d" % os.getpid()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print 'got keybaord interrupt'
C 扩展可以很好地捕获 SIGINT,但我不知道如何从中引发 Python 异常,以便可以在 Python 代码中捕获它。
有什么想法吗?
编辑:
我发现我可以通过以下方式引发 KeyboardInterrupt:
PyErr_SetString(PyExc_KeyboardInterrupt, "SIGINT received");
但如果我在信号处理程序中引发它,它确实会出现段错误。
如果它在其他函数中引发,它不会出现段错误。
为什么我不能在信号处理程序中提高它?
【问题讨论】:
-
我不确定有什么方法可以让它工作。当然不是来自信号处理程序。
-
@IgnacioVazquez-Abrams 它当然可以通过信号处理程序工作。
标签: python c exception signals python-c-extension