Python模組之訊號(signal)

來源:互聯網
上載者:User

標籤:mac   not   sig   ctr   接受   ignore   問題   blog   reg   

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

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

定義訊號名

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

import signalprint(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 functiondef myHandler(signum, frame):    print(‘I received: ‘, signum)# register signal.SIGTSTP‘s handlersignal.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 functiondef 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‘)

Python模組之訊號(signal)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.