Python中的signal模塊和Ctrl+C操做

Python中的signal模塊處理OS級別的信號。例如Ctrl+C會進程發送信號。bash

參考這裏:http://www.javashuo.com/article/p-azwmnisg-eo.htmlapp

Linux上查看信號的方法:ui

[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包來處理。.net

幾個經常使用信號:
SIGINT     終止進程  中斷進程  (control+c)
SIGTERM   終止進程     軟件終止信號
SIGKILL   終止進程     殺死進程
SIGALRM 鬧鐘信號
 線程

進程結束信號 SIGTERM和SIGKILL的區別
SIGTERM比較友好,進程能捕捉這個信號,根據您的須要來關閉程序。在關閉程序以前,您能夠結束打開的記錄文件和完成正在作的任務。在某些狀況下,假如進程正在進行做業並且不能中斷,那麼進程能夠忽略這個SIGTERM信號。
對於SIGKILL信號,進程是不能忽略的。這是一個 「我無論您在作什麼,馬上中止」的信號。假如您發送SIGKILL信號給進程,Linux就將進程中止在那裏。code

發送信號通常有兩種緣由:
1(被動式)  內核檢測到一個系統事件.例如子進程退出會像父進程發送SIGCHLD信號.鍵盤按下control+c會發送SIGINT信號
2(主動式)  經過系統調用kill來向指定進程發送信號
 blog

綁定信號,這裏以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()。get

作Ctrl+C操做時,若是子線程使用第二種方法發起,那麼若是子線程不結束,Ctrl+C中不管是作sys.exit或者os._exit操做,應用都沒法退出,而使用第一種方法,則能夠結束。

相關文章
相關標籤/搜索