Python中的signal模块和Ctrl+C操作

妖精的绣舞 提交于 2019-12-10 11:08:20

Python中的signal模块处理OS级别的信号。例如Ctrl+C会进程发送信号。

参考这里:https://my.oschina.net/u/1178546/blog/157697

Linux上查看信号的方法:

[appadmin@BJLTPGPLM1007T ~]$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
[appadmin@BJLTPGPLM1007T ~]$ 

Python中要捕获信号,需要signal包来处理。

几个常用信号:
SIGINT     终止进程  中断进程  (control+c)
SIGTERM   终止进程     软件终止信号
SIGKILL   终止进程     杀死进程
SIGALRM 闹钟信号
 

进程结束信号 SIGTERM和SIGKILL的区别
SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

发送信号一般有两种原因:
1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
2(主动式)  通过系统调用kill来向指定进程发送信号
 

绑定信号,这里以Ctrl+C举例,它会向进程发出中断信号。

import signal

def quit_signal_handler(signum,frame):
    pass

signal.signal(signal.SIGINT,quit_signal_handler)

 

关于Ctrl+C,实际工作中遇到一个问题,与thread/threading有关。

线程实现的两种方式: thread.start_new_thread和threading.Thread(target=xxx,args=(xxx)).start()。

做Ctrl+C操作时,如果子线程使用第二种方法发起,那么如果子线程不结束,Ctrl+C中无论是做sys.exit或者os._exit操作,应用都无法退出,而使用第一种方法,则可以结束。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!