Python signal 信号模块和进程

2019-07-16  本文已影响0人  河码匠

一、什么是信号

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

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

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

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

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

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. 常用的方法

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]

\color{red}{注意}:在一个进程中只能设置一个 signal. alarm(time),如果设置第二个则会覆盖第一个的时间。

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) 信号处理函数 参数:
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)
上一篇下一篇

猜你喜欢

热点阅读