首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ctrl中断Python扩展

使用Ctrl中断Python扩展
EN

Stack Overflow用户
提问于 2021-07-19 10:01:47
回答 1查看 240关注 0票数 4

我正在为C扩展创建Python包装器,它是传感器的驱动程序。我需要将带有Python的Ctrl中断信号传递给驱动程序,这样它就可以结束当前的采集阶段,而不会启动新的捕获阶段。我发现了这两个相关的主题:Allowing Ctrl-C to interrupt a python C-extensionAllowing Ctrl-C to interrupt a python C-extension,但是它们没有回答我的问题,因为我使用的是Ctypes (见下文)。有没有办法使用Python的线程或ctype来插入C扩展呢?我希望避免对C代码进行任何更改。目标是停止无止境的循环函数。

Python代码:

代码语言:javascript
复制
import signal
import ctypes 
import os 
import sys 

if __name__ == "__main__" :
    libname = os.path.abspath(os.path.join(os.path.dirname(__file__),"clib.so"))
    LIBC = ctypes.CDLL(libname)
    LIBC.main.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char_p),]
    args=(ctypes.c_char_p * (len(sys.argv)-1))(str.encode(sys.argv[1]))
    LIBC.main(len(args),args)
    signal.signal(signal.SIGINT, lambda s,f:os.kill(os.getpid(), signal.SIGTERM))

C代码:

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
#incluse <string.h>

void endless_loop()
{
    while(1){printf("Can't stop me ! \n");}
}
int main(int argc, char* argv[])
{
    endless_loop();
    return 0 ;
}

Makefile

代码语言:javascript
复制
all: test

clean:
    rm -f *.o *.so *.html

clib.so: clib.o
    gcc -shared -o clib.so clib.c -fPIC

clib.o: clib.c
    gcc -Wall -Werror clib.c -fPIC

test: clib.so
    chmod 777 pyclib.py
    python pyclib.py 2

幸亏,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-19 13:54:11

LIBC.main(len(args),args) signal.signal(signal.SIGINT, lambda s,f:os.kill(os.getpid(), signal.SIGTERM))

如果希望在LIBC.main运行时调用信号处理程序,则必须在调用LIBC.main之前(通过signal.signal)安装信号处理程序,而不是在它返回之后。

但是,正如你注意到的:它仍然不起作用。这是因为Python信号处理程序在C扩展运行时不会被执行,而且由于Python主动安装了一个SIGINT处理程序,默认情况下Ctrl无法在这种情况下工作。为了使它中断程序,恢复默认的信号行为:

代码语言:javascript
复制
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    LIBC.main(len(args), args)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68438597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档