Python訊號之分享
在瞭解了Linux的訊號基礎之後,Python標準庫中的signal包就很容易學習和理解。signal包負責在Python程式內部處理訊號,典型的操作包括預設訊號處理函式,暫停並等待訊號,以及定時發出SIGALRM等。要注意,signal包主要是針對UNIX平臺(比如Linux, MAC OS),而Windows核心中由於對訊號機制的支援不充分,所以在Windows上的Python不能發揮訊號系統的功能。
定義訊號名
signal包定義了各個訊號名及其對應的整數,比如
import signal print signal.SIGALRM print signal.SIGCONT
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()中的操作,以針對不同的訊號實現個性化的處理。
定時發出SIGALRM訊號
一個有用的函式是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包被增強,訊號阻塞等功能被加入到該包中。我們暫時不深入到該包中。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026630/viewspace-2987661/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python 之訊號SignalPython
- python學習之訊號量Python
- python中的訊號通訊 blinkerPython
- Python捕捉系統訊號Python
- Qt之訊號與槽QT
- Python 音訊訊號處理庫 librosaPython音訊ROS
- 處理python中的訊號Python
- Python深入分享之閉包Python
- Python分享之Python的記憶體管理Python記憶體
- xenomai核心解析之訊號signal(二)---xenomai訊號處理機制AI
- Python深入分享之裝飾器Python
- 原始碼分析:Semaphore之訊號量原始碼
- PyQT5之自定義訊號QT
- Linux 程式間通訊之System V 訊號量Linux
- Python深入分享之物件的屬性Python物件
- Python教程分享之Python基礎知識點梳理Python
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- 好程式設計師Python教程分享python之變數程式設計師Python變數
- Python分享之內建函式清單Python函式
- 開心檔之C++ 訊號處理C++
- 畫江湖之 Go 學習篇 【訊號量】Go
- 畫江湖之 Go 學習篇 [訊號量]Go
- PyQT5之訊號關閉視窗QT
- QT之靜態函式傳送訊號QT函式
- Python技術分享:Python中的識別符號有哪些基礎原則?Python符號
- 好程式設計師Python教程系列分享之Python語言元素之運算子程式設計師Python
- 好程式設計師Python教程系列分享之Python語言元素之變數程式設計師Python變數
- 訊號
- Python分享之特殊方法與多正規化Python
- web前端技術分享Electron之IPC 通訊Web前端
- web前端培訓分享Electron之IPC 通訊Web前端
- python opencv識別藍牌車牌號 之 取出車牌號 (1/3)PythonOpenCV
- 5月盧鬆鬆視訊號資料分享和觀點
- 微信公眾號開發之客服訊息
- Python語音訊號處理的一些kitPython音訊
- Python-訊號量和執行緒池-semaphore ThreadPollPython執行緒thread
- 怎樣用Python提取資訊呢?分享這3個Python PDF庫Python
- Bold訊號與fNIRS訊號的區別