在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识...

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

root@server:~# kill -l

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

效果如下:

python signal模块_Python2.7 signal相关推荐

  1. python signal模块_Python使用signal模块实现定时执行

    在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识... ...

  2. python signal模块作用_如何理解python中信号Signal?

    信号signal 是python进程间进行信号发送的一种机制,其原理是操作系统对进程的控制,是一种程序中断一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 那么singanl到底有什么用呢 ...

  3. python信号_python 之信号Signal

    信号signal 是python进程间进行信号发送的一种机制,其原理是操作系统对进程的控制,是一种程序中断 一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 那么singanl到底有什么用 ...

  4. [转]python各模块的学习

    [-] 01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 ...

  5. python 各种模块学习

    from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...

  6. python signal模块的使用(自定义超时异常)

    参考文章1:Python之signal模块详解 参考文章2:python中自定义超时异常的几种方法 参考文章3:python如何判断一段代码运行是否超出一定时间,如果超出则抛出异常?(检测函数运行是否 ...

  7. Python中的signal模块和Ctrl+C操作

    2019独角兽企业重金招聘Python工程师标准>>> Python中的signal模块处理OS级别的信号.例如Ctrl+C会进程发送信号. 参考这里:https://my.osch ...

  8. python signal模块作用_Python中的signal模块和Ctrl+C操作

    Python中的signal模块处理OS级别的信号.例如Ctrl+C会进程发送信号. Linux上查看信号的方法: [appadmin@BJLTPGPLM1007T ~]$ kill -l 1) SI ...

  9. 「信号机制」Python信号处理—signal模块

    转载请注明出处:https://blog.csdn.net/jinixin/article/details/80383177 本文是信号机制三篇记录中的第二篇,介绍Python语言中负责信号处理的si ...

最新文章

  1. DIV+CSS规范命名大全集合
  2. [Solution] The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
  3. [20161208]等待事件enq: HW - contention
  4. JavaScript实现图像处理----resizeImageWidth调整图像宽度算法(附完整源码)
  5. OpenCASCADE:使用扩展数据交换 XDE之读写 STEP 或 IGES
  6. Spark 数据挖掘 - 利用决策树预测森林覆盖类型
  7. linux android build tools,build.gradle 文件中的 Android SDK Build Tools version
  8. 【图像融合】评价方法(熵、均方根误差)
  9. 计算机二级考试能不能用键盘,计算机二级 ,你中招了吗?
  10. 2014 年度 Git@OSC【非GitHub】 最热门的 50 个项目
  11. 任天堂FC专题 (现在还有没有人对FC感兴趣? 红白机游戏汉化)
  12. centos7/win7 双系统安装教程
  13. android微信图片选择框架,Android仿微信图片选择器ImageSelector使用详解
  14. 对我的学科方向软件工程开发技术方向的认识
  15. Nacos-配置集中管理
  16. mahout fpg
  17. [转帖]中国新超算彻底告别进口CPU 国产芯片已可与国外抗衡
  18. 《红楼梦》-正文第三十九回名師誦読文稿
  19. pythonurllib库获取yahoo财经数据_用Python从Yahoo财经中获取历史数据
  20. Mac上IDEA无法下载plugins插件

热门文章

  1. 搞笑趣味短信100条
  2. 期待“灵魂伴侣”会让婚姻受挫?
  3. spring boot 启动流程分析
  4. Neural Machine Translation With PyTorch
  5. BAPI_ACC_DOCUMENT_POST 税务科目过账
  6. linux下压缩文件解压文件,linux下 解压和压缩文件 rar文件解压
  7. ActionBar、TitleBar、ToolBar的联系和区别
  8. nltk与ipython悲伤的故事之内存也许溢出。。。
  9. 关于物理引擎的使用,及其重力感应的小test
  10. lzo文件压缩,解压