📅  最后修改于: 2023-12-03 15:24:20.030000             🧑  作者: Mango
在 Python 中,我们可以通过 signal
模块来捕获信号。Ctrl+C 是一个终止进程的信号,也称为 SIGINT。
下面将介绍如何在 Python 中捕获 Ctrl+C 信号,以及在信号处理函数中做一些清理工作。
我们可以使用 signal
模块中的 signal
方法来注册信号处理函数,示例代码如下:
import signal
import time
def signal_handler(signal, frame):
print('You pressed Ctrl+C!')
exit(0)
signal.signal(signal.SIGINT, signal_handler)
while True:
print('Press Ctrl+C')
time.sleep(1)
这段程序运行后,会持续输出 Press Ctrl+C
,当我们按下 Ctrl+C 后,会输出 You pressed Ctrl+C!
并结束程序。
在上述代码中,我们定义了一个 signal_handler
函数作为信号处理函数,并使用 signal.SIGINT
注册了 Ctrl+C 信号的处理函数。当接收到 Ctrl+C 信号时,我们执行自定义的信号处理函数,打印一句话并结束程序。
在信号处理函数中,我们可以编写一些程序清理工作,以避免进程意外终止时出现问题。例如,我们可以关闭一些正在运行的线程,保存临时文件,或者发送一些日志信息。
下面是一个做清理工作的例子:
import signal
import time
import threading
def signal_handler(signal, frame):
print('You pressed Ctrl+C!')
print('Closing threads...')
threads = threading.enumerate()
for thread in threads:
if thread != threading.current_thread():
thread.stop()
exit(0)
signal.signal(signal.SIGINT, signal_handler)
class MyThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
while True:
print('{} is running...'.format(self.name))
time.sleep(1)
t1 = MyThread('thread1')
t2 = MyThread('thread2')
t1.start()
t2.start()
while True:
print('Press Ctrl+C')
time.sleep(1)
在上述代码中,我们定义了两个线程 t1
和 t2
,然后在信号处理函数中关闭这两个线程。当我们按下 Ctrl+C 时,程序会输出 You pressed Ctrl+C!
并关闭正在运行的线程。
通过 signal
模块,我们可以很容易地捕获 Ctrl+C 信号,并在信号处理函数中做清理工作。这有助于我们避免进程在意外终止时造成问题。