Python模組之訊號(signal)

2021-09-27 11:24:24 字數 2599 閱讀 7791

在了解了linux的訊號基礎之 後,python標準庫中的signal包就很容易學習和理解。signal包負責在python程式內部處理訊號,典型的操作包括預設訊號處理函式,暫 停並等待訊號,以及定時發出sigalrm等。要注意,signal包主要是針對unix平台(比如linux, mac os),而windows核心中由於對訊號機制的支援不充分,所以在windows上的python不能發揮訊號系統的功能。

訊號(signal)-- 程序之間通訊的方式,是一種軟體中斷。乙個程序一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。

signal包定義了各個訊號名及其對應的整數,比如:

import signal

print(signal.sigabrt)

print(signal.sig_dfl)

python所用的訊號名與linux一致,可以通過$ man 7 signal 查詢

signal包的核心是使用signal.signal()函式來預設(register)訊號處理函式,如下所示:

singnal.signal(signalnum, handler)

signalnum為某個訊號,handler為該訊號的處理函式。我們在訊號基礎裡提到,程序可以無視訊號,可以採取預設操作,還可以自定義操作。當handler為signal.sig_ign時,訊號被無視(ignore)。當handler為singal.sig_dfl,程序採取預設操作(default)。當handler為乙個函式名時,程序採取函式中定義的操作。

import signal

# define signal handler function

def myhandler(signum, frame):

print('i received: ', signum)

# register signal.sigtstp's handler

signal.signal(signal.sigtstp, myhandler)

signal.pause()

print('end of signal demo')

# 有問題待測試

在主程式中,我們首先使用signal.signal()函式來預設訊號處理函式。然後我們執行signal.pause()來讓該程序暫停以等待訊號, 以等待訊號。當訊號sigusr1被傳遞給該程序時,程序從暫停中恢復,並根據預設,執行sigtstp的訊號處理函式myhandler()。 myhandler的兩個引數乙個用來識別訊號(signum),另乙個用來獲得訊號發生時,程序棧的狀況(stack frame)。這兩個引數都是由signal.singnal()函式來傳遞的。
上面的程式可以儲存在乙個檔案中(比如test.py)。我們使用如下方法執行:

$python test.py

以便讓程序執行。當程式執行到signal.pause()的時候,程序暫停並等待訊號。此時,通過按下ctrl+z向該程序傳送sigtstp訊號。我們可以看到,程序執行了myhandle()函式, 隨後返回主程式,繼續執行。(當然,也可以用$ps查詢process id, 再使用$kill來發出訊號。)

(程序並不一定要使用signal.pause()暫停以等待訊號,它也可以在進行工作中接受訊號,比如將上面的signal.pause()改為乙個需要長時間工作的迴圈。)

我們可以根據自己的需要更改myhandler()中的操作,以針對不同的訊號實現個性化的處理。

乙個有用的函式是signal.alarm(),它被用於在一定時間之後,向程序自身傳送sigalrm訊號:

import signal

# define signal handler function

def myhandler(signum, frame):

print("now, it's the time")

exit()

# register signal.sigalrm's handler 

signal.signal(signal.sigalrm, myhandler)

signal.alarm(5)

while true:

print('not yet')

我們這裡用了乙個無限迴圈以便讓程序持續執行。在signal.alarm()執行5秒之後,程序將向自己發出sigalrm訊號,隨後,訊號處理函式myhandler開始執行。

signal包的核心是設定訊號處理函式。除了signal.alarm()向自身傳送訊號之外,並沒有其他傳送訊號的功能。但在os包中,有類似於linux的kill命令的函式,分別為

os.kill(pid, sid)

os.killpg(pgid, sid)

分別向程序和程序組(見linux程序關係)傳送訊號。sid為訊號所對應的整數或者singal.sig*。

實際上signal, pause,kill和alarm都是linux應用程式設計中常見的c庫函式,在這裡,我們只不過是用python語言來實現了一下。實際上,python 的直譯器是使用c語言來編寫的,所以有此相似性也並不意外。此外,在python 3.4中,signal包被增強,訊號阻塞等功能被加入到該包中。我們暫時不深入到該包中。

signal.sig*

signal.signal()

signal.pause()

signal.alarm()

出處:

python 訊號處理模組signal

signal包負責在python程式內部處理訊號,典型的操作包括預設訊號處理函式,暫停並等待訊號,以及定時發出sigalrm等。要注意,signal包主要是針對unix平台 比如linux,mac os 而windows核心中由於對訊號機制的支援不充分 signal包定義了各個訊號名及其對應的整數,...

Python 訊號處理 signal 模組

官方文件上有這樣的示例 import signal,os 定義乙個訊號處理函式,該函式列印收到的訊號,然後raise ioerror def handler signum,frame print signal handler called with signal signum raise ioerr...

Python訊號處理模組signal

python中對訊號處理的模組主要是使用signal模組,但signal主要是針對unix系統,所以在windows平台上python不能很好的發揮訊號處理的功能。要檢視python中的訊號量,可以使用dir signal 來檢視。在signal模組中,主要是使用signal.signal 函式來預...