python signal模块_Python signal 信号模块和进程

一、什么是信号

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用 kill 发送软中断信号。

内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

1. 进程对信号的处理方法

第一种方法:类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。

第二种方法:忽略某个信号,对该信号不做任何处理,就象未发生过一样。

第三种方法:对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用 signal 来指定进程对某个信号的处理行为。

------ 以上来自百度百科 ------

2. 查询信号 kill -l

3. 给进程发信号 kill -信号值 pid

二、Python signal 信号模块

1. 常见的信号类型

信号名

描述

signal.SIGHUP

连接挂断,一般是在用户终端连接结束时发出。

signal.SIGILL

非法指令,在进程试图执行一些非法指令时(比如可执行文件发生错误)发出

signal.SIGINT

终止进程(ctrl + c)

signal.SIGTSTP

暂停进程(ctrl + z)

signal.SIGKILL

特殊信号,杀死一个进程。这个不能被堵塞、处理或忽略

signal.SIGSTOP

特殊行啊,暂停一个进程。这个不能被堵塞、处理或忽略

signal.SIGQUIT

终端退出(ctrl + \)

signal.SIGTERM

终止信号,软件终止信号

signal.SIGALRM

闹钟信号,由 signal.alarm() 发起

signal.SIGCONT

继续执行暂停进程

2. 常用的方法

signal.alarm(time) 叫做闹钟或者报警器

在 time(单位秒)时间后终止程序

示例:

#!coding=utf-8

import signal

import time

signal.alarm(5)

for i in range(10):

print i

time.sleep(1)

这里面 signal.alarm(5) 是程序只执行5秒

结果如下

0

1

2

3

4

[Finished in 5.9s with exit code -14]

math?formula=%5Ccolor%7Bred%7D%7B%E6%B3%A8%E6%84%8F%7D:在一个进程中只能设置一个 signal. alarm(time),如果设置第二个则会覆盖第一个的时间。

signal.pause() 暂停进程直到出现一个信号

signal.pause() 会把进程暂停且等待出现任何一个信号后,执行 signal.pause() 后面的语句。

示例

#!coding=utf-8

import signal

import time

signal.alarm(5)

signal.pause()

for i in range(10):

print i

time.sleep(1)

没有信号的情况下,不会执行 for 循环。而且 5 秒后自动结束。

signal.signal(sig, handler) 信号处理函数

函数

说明

参数

signal.signal(sig, handler)

信号处理函数

参数:

handler:

SIG_IGN:信号被忽略

SIG_DFL: 进程采用默认行为处理

function: 传入一个函数,自定义处理过程

SIGSTOP SIGKILL: 不能处理,只能采用

示例:无视 CTRL+C 操作

#!coding=utf-8

import signal

signal.alarm(10)

signal.signal(signal.SIGINT, signal.SIG_IGN)

signal.pause()

在这10秒期间 CTRL+C 无效。10秒后自动关闭。

示例:函数处理信号

#!coding=utf-8

import signal

import time

def func(signum, frame):

if signum == signal.SIGALRM:

print('alarm SIGALRM 信号')

elif signum == signal.SIGINT:

print("CTRL+C SIGINT 信号")

signal.alarm(5)

signal.signal(signal.SIGINT, func)

signal.signal(signal.SIGALRM, func)

while True:

print('循环...')

time.sleep(1)

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值