信号 | 说明 |
---|---|
SIG_DFL | |
SIG_IGN | 标准信号处理程序,它将简单地忽略给定的信号 |
SIGABRT SIGIOT | 来自 abort 的中止信号。 abort 导致异常进程终止。通常由检测内部错误或严重破坏约束的库函数调用。例如,如果堆的内部结构被堆溢出损坏, malloc() 将调用 abort() |
SIGALRM SIGVTALRM SIGPROF |
如果你用 setitimer 这一类的报警设置函数设置了一个时限,到达时限时进程会接收到 SIGALRM, SIGVTALRM 或者 SIGPROF。但是这三个信号量的含义各有不同,SIGALRM 计时的是真实时间,SIGVTALRM计时的是进程使用了多少CPU时间,而 SIGPROF 计时的是进程和代表该进程的内核用了多少时间。 |
SIGBUS | 总线发生错误时,进程接收到一个SIGBUS信号。举例来说,存储器访问对齐或者或不存在对应的物理地址都会产生SIGBUS信号。 |
SIGCHLD | 当子进程终止、被中断或被中断后恢复时,SIGCHLD信号被发送到进程。该信号的一个常见用法是指示操作系统在子进程终止后清理其使用的资源,而不显式调用等待系统调用。 |
SIGILL | 非法指令。当进程试图执行非法、格式错误、未知或特权指令时,SIGILL信号被发送到该进程。 |
SIGKILL | 发送SIGKILL信号到一个进程可以使其立即终止(KILL)。与SIGTERM和SIGINT相不同的是,这个信号不能被捕获或忽略,接收过程在接收到这个信号时不能执行任何清理。 以下例外情况适用: |
SIGINT | 来自键盘的中断 (CTRL + C)。 KeyboardInterrupt |
SIGPIPE | 当一个进程试图写入一个没有连接到另一端进程的管道时,SIGPIPE信号会被发送到该进程。 |
**SIGTERM ** | 终结信号。 KILL -15 |KILL |
SIGUSR1 SIGUSR2 |
用户自定义信号 |
SIGWINCH | 终端窗口大小已变化 |
SIGHUP | 在控制终端上检测到挂起或控制进程的终止。 |
Reference:[signal-wikipedia](
Python的信号库中也有很多常用的函数
创建一个 SIGALRM 类型的信号,time为预定的时间,设置为0时取消先前设置的定时器
可以使代码逻辑处理过程睡眠,直到收到信号,然后调用对应的handler。
import signal import os import time def do_exit(sig, stack): raise SystemExit('Exiting') signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGUSR1, do_exit) print('My PID:', os.getpid()) signal.pause()
在执行时,忽略了ctrl + c的信号,对USR1做退出操作
which: signal.ITIMER_REAL,signal.ITIMER_VIRTUAL 或 signal.ITIMER_PROF
seconds:多少秒后触发which。seconds设置为0可以清除which的计时器。
interval:每隔interval秒后触发一次
获得当前执行程序的pid
在Linux中,可以通过任何可接受的信号枚举值作为信号函数的参数。在Windows中,SIGABRT, SIGFPE, SIGINT, SIGILL, SIGSEGV, SIGTERM, SIGBREAK。
在一些时候,signal handling的操作需要对应主进程传递进来一些函数,而在整个项目中执行过程中的变量与 signal handling不处于一个作用域中,而signal.signal() 不能传递其他的参数,这个时候可以使用 partial 创建一个闭包来解决这个问题。
例如:
import signal import os import sys import time from functools import partial """ 这里signal frame默认参数需要放到最后 """ def signal_handler(test_parameter1, test_parameter2, signal_num, frame): print "signal {} exit. {} {}".format(signal_num, test_parameter1, test_parameter2) sys.exit(1) a=1 b=2 signal.signal(signal.SIGINT, partial(signal_handler, a, b) ) print('My PID:', os.getpid()) signal.pause()
signal定义了忽略接收信号的方法。为了实现信号的处理,需要使用signal.signal() 将默认的信号与signal.SIG_IGN 注册,即可忽略对应的信号中断,kill -9 不可忽略 。
import signal import os import time def receiveSignal(signalNumber, frame): print('Received:', signalNumber) raise SystemExit('Exiting') return if __name__ == '__main__': # register the signal to be caught signal.signal(signal.SIGUSR1, receiveSignal) # register the signal to be ignored signal.signal(signal.SIGINT, signal.SIG_IGN) # output current process id print('My PID is:', os.getpid()) signal.pause()
import signal import os import time import sys def readConfiguration(signalNumber, frame): print ('(SIGHUP) reading configuration') return def terminateProcess(signalNumber, frame): print ('(SIGTERM) terminating the process') sys.exit() def receiveSignal(signalNumber, frame): print('Received:', signalNumber) return signal.signal(signal.SIGHUP, readConfiguration) signal.signal(signal.SIGINT, receiveSignal) signal.signal(signal.SIGQUIT, receiveSignal) signal.signal(signal.SIGILL, receiveSignal) signal.signal(signal.SIGTRAP, receiveSignal) signal.signal(signal.SIGABRT, receiveSignal) signal.signal(signal.SIGBUS, receiveSignal) signal.signal(signal.SIGFPE, receiveSignal) #signal.signal(signal.SIGKILL, receiveSignal) signal.signal(signal.SIGUSR1, receiveSignal) signal.signal(signal.SIGSEGV, receiveSignal) signal.signal(signal.SIGUSR2, receiveSignal) signal.signal(signal.SIGPIPE, receiveSignal) signal.signal(signal.SIGALRM, receiveSignal) signal.signal(signal.SIGTERM, terminateProcess)
到此这篇关于python中对信号处理的文章就介绍到这了,更多相关python信号处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!