python2.7和3.7的區別,python signal模塊_Python2.7 signal

 2023-12-06 阅读 37 评论 0

摘要:在liunx系統中要想每隔一分鐘執行一個命令,最普遍的方法就是crontab了,如果不想使用crontab,經同事指點在程序中可以用定時器實現這種功能,于是就開始摸索了,發現需要一些信號的知識...python2.7和3.7的區別。查看你的linux支持哪些信號&#

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

python2.7和3.7的區別。查看你的linux支持哪些信號:kill -l 即可

root@server:~# kill -l

python3哪個版本好用,1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP

6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1

11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM

16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP

21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ

26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR

31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) 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+1247) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-956) 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:~#

信號:進程之間通訊的方式,是一種軟件中斷。一個進程一旦接收到信號就會打斷原來的程序執行流程來處理信號。操作系統規定了進程收到信號以后的默認行為,但是,我們可以通過綁定信號處理函數來修改進程收到信號以后的行為,有兩個信號是不可更改的SIGTOP和SIGKILL。

發送信號一般有兩種原因:

1(被動式) ?內核檢測到一個系統事件.例如子進程退出會像父進程發送SIGCHLD信號.鍵盤按下control+c會發送SIGINT信號

2(主動式) ?通過系統調用kill來向指定進程發送信號

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

ITIMER_REAL 定時真實時間,與alarm類型相同。 SIGALRM

ITIMER_VIRT 定時進程在用戶態下的實際執行時間。 SIGVTALRM

ITIMER_PROF 定時進程在用戶態和核心態下的實際執行時間。 SIGPROF

這三種定時器定時完成時給進程發送的信號各不相同,其中ITIMER_REAL類定時器發送SIGALRM信號,ITIMER_VIRT類定時器發送SIGVTALRM信號,ITIMER_REAL類定時器發送SIGPROF信號。

函數alarm本質上設置的是低精確、非重載的ITIMER_REAL類定時器,它只能精確到秒,并且每次設置只能產生一次定時。函數setitimer設置的定時器則不同,它們不但可以計時到微妙(理論上),還能自動循環定時。在一個Unix進程中,不能同時使用alarm和ITIMER_REAL類定時器。

SIGINT ? ?終止進程 ? ? 中斷進程 ?(control+c)

SIGTERM ? 終止進程 ? ? 軟件終止信號

SIGKILL ? 終止進程 ? ? 殺死進程

SIGALRM ? 鬧鐘信號

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

signal模塊的異常:

exception signal.ItimerError

獲取在執行setitimer()和getitimer()時的異常錯誤。

signal模塊定義的方法:

signal.alarm(time)

如果time是個非0的值,則函數會請求SIGALRM信號在經過time秒之后發送到進程。如果time是0值,則alarm不會被調度。

signal.getsignal(signalnum)

針對signalnum返回當前的信號句柄。

signal.pause()

設置一個進程到休眠狀態直到一個信號喚醒他。

signal.setitimer(which, seconds[, interval])

設置一個時間計時器,在經過seconds時間后觸發which(signal.ITIMER_REAL, signal.ITIMER_VIRTUAL or signal.ITIMER_PROF),并且以后每隔interval時間進行輪訓。interval設置為0表示清除which。

經過interval時間后,一個信號會被發送給進程,發送信號的時間依賴于timer的設置。

signal.getitimer(which)

返回一個當前which指定的interval時間。

signal.set_wakeup_fd(fd)

設置喚醒一個fd,當收到相關信號后,

signal.siginterrupt(signalnum, flag)

改變默認的系統調用行為,如果flag設置為False,當收到中斷信號后,系統調用會被重新啟動。

signal.signal(signalnum, handler)

設置一個信號給function handler

下面舉個簡單的例子,每5秒鐘收集一次網卡的流量信息

#!/usr/bin/python

import time

import signal

import psutil

def GetNetwork(num,_):

for keys in psutil.network_io_counters(pernic=True):

if keys == 'em1':

print psutil.network_io_counters(pernic=True)[keys][0],psutil.network_io_counters(pernic=True)[keys][1]

print 'NOW time is: %s' % time.time()

signal.signal(signal.SIGALRM,GetNetwork)

signal.setitimer(signal.ITIMER_REAL,1,5)

while True:

pass

效果如下:

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/190389.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息