使用Python的signal()函数处理不同类型的信号
在Python中,可以使用signal模块中的signal()函数来处理不同类型的信号。signal()函数用于定义信号处理程序,它接受两个参数:一个是信号编号,另一个是信号处理函数。当接收到指定的信号时,执行信号处理函数。
下面是几个常见的信号处理示例:
1. SIGINT:当按下Ctrl+C时发送给进程的中断信号。可以使用signal.SIGINT常量来表示该信号。
import signal
import time
import sys
def signal_handler(sig, frame):
print('Received SIGINT. Exiting...')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
while True:
print('Running...')
time.sleep(1)
在这个例子中,我们定义了一个信号处理函数signal_handler()来处理SIGINT信号。当收到该信号时,打印一条消息并退出程序。
2. SIGTERM:当使用kill命令发送给进程的终止信号。可以使用signal.SIGTERM常量来表示该信号。
import signal
import time
import sys
def signal_handler(sig, frame):
print('Received SIGTERM. Exiting...')
sys.exit(0)
signal.signal(signal.SIGTERM, signal_handler)
while True:
print('Running...')
time.sleep(1)
在这个例子中,我们定义了一个信号处理函数signal_handler()来处理SIGTERM信号。当收到该信号时,打印一条消息并退出程序。
3. SIGALRM:当计时器超时时发送的信号。可以使用signal.SIGALRM常量来表示该信号。
import signal
def signal_handler(sig, frame):
print('Alarm triggered.')
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(5) # 设置计时器5秒后触发
while True:
pass
在这个例子中,我们定义了一个信号处理函数signal_handler()来处理SIGALRM信号。我们使用signal.alarm()来设置一个计时器,5秒后触发信号。
除了上述示例之外,还有其他一些常见的信号,如SIGKILL、SIGSTOP、SIGHUP等。要处理这些信号,只需按照相同的方式定义信号处理函数并将其与适当的信号编号关联起来即可。
需要注意的是,在Windows系统上,signal()函数不支持所有的信号类型,因为信号是Unix系统上的一个概念。在Windows上,可以使用signal.SIGBREAK来处理Ctrl+Break信号。
总之,Python的signal()函数提供了一种处理不同类型信号的方式,对于处理进程的终止信号、中断信号等非常有用。通过定义信号处理函数并将其与信号编号关联,我们可以在接收到特定信号时执行所需的操作。
