最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Python中signal包的使用

 更新時間:2015年11月13日 17:10:44   作者:China_OS  
這篇文章主要介紹了Python中signal包的使用,主要在Linux系統(tǒng)下對進程信號進行相關(guān)操作,需要的朋友可以參考下

在liunx系統(tǒng)中要想每隔一分鐘執(zhí)行一個命令,最普遍的方法就是crontab了,如果不想使用crontab,經(jīng)同事指點在程序中可以用定時器實現(xiàn)這種功能,于是就開始摸索了,發(fā)現(xiàn)需要一些信號的知識...

查看你的linux支持哪些信號:kill -l 即可

root@server:~# 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 
root@server:~#
    信號:進程之間通訊的方式,是一種軟件中斷。一個進程一旦接收到信號就會打斷原來的程序執(zhí)行流程來處理信號。操作系統(tǒng)規(guī)定了進程收到信號以后的默認(rèn)行為,但是,我們可以通過綁定信號處理函數(shù)來修改進程收到信號以后的行為,有兩個信號是不可更改的SIGTOP和SIGKILL。
發(fā)送信號一般有兩種原因:
    1(被動式)  內(nèi)核檢測到一個系統(tǒng)事件.例如子進程退出會像父進程發(fā)送SIGCHLD信號.鍵盤按下control+c會發(fā)送SIGINT信號
    2(主動式)  通過系統(tǒng)調(diào)用kill來向指定進程發(fā)送信號

   在C語言中有個setitimer函數(shù),函數(shù)setitimer可以提供三種定時器,它們相互獨立,任意一個定時完成都將發(fā)送定時信號到進程,并且自動重新計時。參數(shù)which確定了定時器的類型:

ITIMER_REAL       定時真實時間,與alarm類型相同。              SIGALRM
ITIMER_VIRT       定時進程在用戶態(tài)下的實際執(zhí)行時間。            SIGVTALRM
ITIMER_PROF       定時進程在用戶態(tài)和核心態(tài)下的實際執(zhí)行時間。      SIGPROF
  這三種定時器定時完成時給進程發(fā)送的信號各不相同,其中ITIMER_REAL類定時器發(fā)送SIGALRM信號,ITIMER_VIRT類定時器發(fā)送SIGVTALRM信號,ITIMER_REAL類定時器發(fā)送SIGPROF信號。
  函數(shù)alarm本質(zhì)上設(shè)置的是低精確、非重載的ITIMER_REAL類定時器,它只能精確到秒,并且每次設(shè)置只能產(chǎn)生一次定時。函數(shù)setitimer設(shè)置的定時器則不同,它們不但可以計時到微妙(理論上),還能自動循環(huán)定時。在一個Unix進程中,不能同時使用alarm和ITIMER_REAL類定時器。

    SIGINT    終止進程     中斷進程  (control+c)
    SIGTERM   終止進程     軟件終止信號
    SIGKILL   終止進程     殺死進程
    SIGALRM   鬧鐘信號

前期的知識也準(zhǔn)備的差不多了,該向python的signal進軍了。

定義信號名

signal包定義了各個信號名及其對應(yīng)的整數(shù),比如

import signal
print signal.SIGALRM
print signal.SIGCONT

Python所用的信號名和Linux一致。你可以通過

$man 7 signal

查詢

預(yù)設(shè)信號處理函數(shù)

signal包的核心是使用signal.signal()函數(shù)來預(yù)設(shè)(register)信號處理函數(shù),如下所示:

singnal.signal(signalnum, handler)

signalnum為某個信號,handler為該信號的處理函數(shù)。我們在信號基礎(chǔ)里提到,進程可以無視信號,可以采取默認(rèn)操作,還可以自定義操作。當(dāng)handler為signal.SIG_IGN時,信號被無視(ignore)。當(dāng)handler為singal.SIG_DFL,進程采取默認(rèn)操作(default)。當(dāng)handler為一個函數(shù)名時,進程采取函數(shù)中定義的操作。

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()函數(shù)來預(yù)設(shè)信號處理函數(shù)。然后我們執(zhí)行signal.pause()來讓該進程暫停以等待信號,以等待信號。當(dāng)信號SIGUSR1被傳遞給該進程時,進程從暫停中恢復(fù),并根據(jù)預(yù)設(shè),執(zhí)行SIGTSTP的信號處理函數(shù)myHandler()。myHandler的兩個參數(shù)一個用來識別信號(signum),另一個用來獲得信號發(fā)生時,進程棧的狀況(stack frame)。這兩個參數(shù)都是由signal.singnal()函數(shù)來傳遞的。

上面的程序可以保存在一個文件中(比如test.py)。我們使用如下方法運行:

$python test.py

以便讓進程運行。當(dāng)程序運行到signal.pause()的時候,進程暫停并等待信號。此時,通過按下CTRL+Z向該進程發(fā)送SIGTSTP信號。我們可以看到,進程執(zhí)行了myHandle()函數(shù), 隨后返回主程序,繼續(xù)執(zhí)行。(當(dāng)然,也可以用$ps查詢process ID, 再使用$kill來發(fā)出信號。)

(進程并不一定要使用signal.pause()暫停以等待信號,它也可以在進行工作中接受信號,比如將上面的signal.pause()改為一個需要長時間工作的循環(huán)。)

我們可以根據(jù)自己的需要更改myHandler()中的操作,以針對不同的信號實現(xiàn)個性化的處理。

定時發(fā)出SIGALRM信號

一個有用的函數(shù)是signal.alarm(),它被用于在一定時間之后,向進程自身發(fā)送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')

我們這里用了一個無限循環(huán)以便讓進程持續(xù)運行。在signal.alarm()執(zhí)行5秒之后,進程將向自己發(fā)出SIGALRM信號,隨后,信號處理函數(shù)myHandler開始執(zhí)行。 

發(fā)送信號

signal包的核心是設(shè)置信號處理函數(shù)。除了signal.alarm()向自身發(fā)送信號之外,并沒有其他發(fā)送信號的功能。但在os包中,有類似于linux的kill命令的函數(shù),分別為

os.kill(pid, sid)

os.killpg(pgid, sid)

分別向進程和進程組(見Linux進程關(guān)系)發(fā)送信號。sid為信號所對應(yīng)的整數(shù)或者singal.SIG*。

實際上signal, pause,kill和alarm都是Linux應(yīng)用編程中常見的C庫函數(shù),在這里,我們只不過是用Python語言來實現(xiàn)了一下。實際上,Python 的解釋器是使用C語言來編寫的,所以有此相似性也并不意外。此外,在Python 3.4中,signal包被增強,信號阻塞等功能被加入到該包中。我們暫時不深入到該包中。

相關(guān)文章

  • Python基礎(chǔ)之變量的相關(guān)知識總結(jié)

    Python基礎(chǔ)之變量的相關(guān)知識總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python變量展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 使用python采集Excel表中某一格數(shù)據(jù)

    使用python采集Excel表中某一格數(shù)據(jù)

    這篇文章主要介紹了使用python采集Excel表中某一格數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Python單向鏈表和雙向鏈表原理與用法實例詳解

    Python單向鏈表和雙向鏈表原理與用法實例詳解

    這篇文章主要介紹了Python單向鏈表和雙向鏈表原理與用法,結(jié)合實例形式詳細(xì)分析了單向鏈表與雙向鏈表的概念、原理以及創(chuàng)建、添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python解析json代碼實例解析

    Python解析json代碼實例解析

    這篇文章主要介紹了Python解析json代碼實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Python實現(xiàn)視頻畫質(zhì)增強的示例代碼

    Python實現(xiàn)視頻畫質(zhì)增強的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實現(xiàn)對視頻進行畫質(zhì)增強功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-04-04
  • python實現(xiàn)的批量分析xml標(biāo)簽中各個類別個數(shù)功能示例

    python實現(xiàn)的批量分析xml標(biāo)簽中各個類別個數(shù)功能示例

    這篇文章主要介紹了python實現(xiàn)的批量分析xml標(biāo)簽中各個類別個數(shù)功能,涉及Python針對xml文件的遍歷、讀取、解析等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Python多維/嵌套字典數(shù)據(jù)無限遍歷的實現(xiàn)

    Python多維/嵌套字典數(shù)據(jù)無限遍歷的實現(xiàn)

    下面小編就為大家?guī)硪黄狿ython多維/嵌套字典數(shù)據(jù)無限遍歷的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • python利用JMeter測試Tornado的多線程

    python利用JMeter測試Tornado的多線程

    這篇文章主要介紹了python利用JMeter測試Tornado的多線程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python時區(qū)設(shè)置方法與pytz查詢時區(qū)教程

    Python時區(qū)設(shè)置方法與pytz查詢時區(qū)教程

    這篇文章主要介紹了Python時區(qū)設(shè)置的方法和pytz查詢時區(qū)的方法,大家參考使用吧
    2013-11-11
  • MoviePy常用剪輯類及Python視頻剪輯自動化

    MoviePy常用剪輯類及Python視頻剪輯自動化

    這篇文章主要介紹了MoviePy常用剪輯類及Python視頻剪輯自動化,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

明星| 南岸区| 临沧市| 新乐市| 老河口市| 瑞丽市| 上杭县| 玉林市| 洛隆县| 陇南市| 兴山县| 金塔县| 册亨县| 闽侯县| 营口市| 开阳县| 河津市| 丽水市| 朝阳县| 吉水县| 瑞昌市| 江口县| 图木舒克市| 玉屏| 金秀| 祁东县| 保亭| 隆回县| 安顺市| 弥渡县| 丰镇市| 虹口区| 株洲市| 白朗县| 汉源县| 壶关县| 宜川县| 万山特区| 双桥区| 开鲁县| 白朗县|