如何在Python中捕獲SIGINT信號?
在Linux中,信號是一種進程間通信機制。愛掏網(wǎng) - it200.com它可以是外部事件的結(jié)果,例如一個用戶按下CTRL+C 強制終止運行中的程序。愛掏網(wǎng) - it200.comPython提供了一個signal模塊,使我們能夠在代碼中捕獲和處理信號。愛掏網(wǎng) - it200.com在本篇文章中,我們將深入了解如何在Python中捕獲SIGINT信號。愛掏網(wǎng) - it200.com
SIGINT(signal interrupt)是在UNIX和類UNIX操作系統(tǒng)中使用的一種信號,它表示用戶想要中斷程序的執(zhí)行。愛掏網(wǎng) - it200.com在Linux中,當(dāng)用戶按下CTRL+C時,就會發(fā)送SIGINT信號到運行中的程序。愛掏網(wǎng) - it200.com
通常情況下,SIGINT信號會使程序立即中止,這意味著程序會立即終止進程中的任何正在執(zhí)行的任務(wù),并釋放進程占用的所有資源。愛掏網(wǎng) - it200.com因此,有時候我們需要在程序捕獲到SIGINT信號后執(zhí)行一些操作。愛掏網(wǎng) - it200.com
信號處理
在Python中,我們可以使用signal模塊來自定義信號處理器。愛掏網(wǎng) - it200.com當(dāng)Python進程接收到一個信號時,它會檢查是否已經(jīng)定義了相應(yīng)的信號處理器。愛掏網(wǎng) - it200.com如果已經(jīng)定義,Python會調(diào)用該處理器來執(zhí)行我們定義的操作。愛掏網(wǎng) - it200.com
signal模塊中定義的函數(shù)如下:
signal.signal(signalnum, handler)
其中,signalnum 是要處理的信號的標(biāo)識符,handler是一個函數(shù),當(dāng)接收到該信號時會調(diào)用這個函數(shù)。愛掏網(wǎng) - it200.com
對于SIGINT信號,在Python中對應(yīng)標(biāo)識符為signal.SIGINT。愛掏網(wǎng) - it200.com
捕獲SIGINT信號
下面是一個使用signal模塊在Python中捕獲SIGINT信號的示例:
import signal
import time
def handler(signum, frame):
print('收到 SIGINT 信號')
signal.signal(signal.SIGINT, handler)
print("開始運行")
while True:
time.sleep(1)
在上面的代碼中,我們定義了一個處理函數(shù)handler(),當(dāng)我們的程序接收到SIGINT信號時,它會輸出”收到 SIGINT 信號”。愛掏網(wǎng) - it200.com此后,我們使用signal模塊的signal函數(shù)將handler()函數(shù)綁定到SIGINT信號上。愛掏網(wǎng) - it200.com
最后,我們在while循環(huán)中讓程序不停地運行。愛掏網(wǎng) - it200.com
現(xiàn)在我們運行該程序。愛掏網(wǎng) - it200.com在程序運行的時候,我們按下CTRL+C會發(fā)出SIGINT信號,此時程序會停止并輸出”收到 SIGINT 信號”。愛掏網(wǎng) - it200.com
代碼注釋
接下來,我們對上面的代碼進行解釋。愛掏網(wǎng) - it200.com
import signal:首先,我們需要導(dǎo)入signal模塊。愛掏網(wǎng) - it200.com
import time:這里我們使用time模塊來讓程序暫停一秒鐘。愛掏網(wǎng) - it200.com
def handler(signum, frame)::定義signal處理函數(shù)。愛掏網(wǎng) - it200.com當(dāng)程序接收到SIGINT信號時,就會調(diào)用該函數(shù)。愛掏網(wǎng) - it200.com