通过signal()函数实现Python中的信号通信
发布时间:2023-12-28 07:28:07
在Python中,可以使用signal.signal()函数来注册信号处理函数,从而实现进程间的信号通信。以下是一个使用signal()函数实现信号通信的示例代码。
import os
import signal
import time
def handle_signal(signum, frame):
# 信号处理函数
print(f'Received signal {signum} in process {os.getpid()}')
# 注册信号处理函数
signal.signal(signal.SIGUSR1, handle_signal)
def send_signal(pid):
# 向指定进程发送信号
os.kill(pid, signal.SIGUSR1)
def receive_signal():
# 接收信号
while True:
time.sleep(1)
# 创建子进程
pid = os.fork()
if pid == 0:
# 子进程
print(f'Child process {os.getpid()} running')
receive_signal()
else:
# 父进程
print(f'Parent process {os.getpid()} running')
time.sleep(1) # 等待子进程注册信号处理函数
send_signal(pid)
time.sleep(1) # 等待子进程处理信号
在上述示例中,首先定义了一个信号处理函数handle_signal(),用于处理接收到的信号。然后通过signal.signal()函数将该处理函数注册为 SIGUSR1 信号的处理函数。
在接下来的代码中,创建了一个子进程,并根据进程的返回值判断当前进程是父进程还是子进程。子进程进入receive_signal()函数中,该函数通过一个无限循环用于接收信号;父进程通过send_signal()函数向子进程发送信号。
在父进程中,先等待1秒钟,确保子进程已经注册了信号处理函数,然后通过send_signal()函数向子进程发送信号。再等待1秒钟,确保子进程已经处理了信号。
运行上述代码,可以看到输出结果中,子进程打印了接收到的信号号码和进程号,父进程打印了发送信号的进程号。
这就是使用signal()函数实现Python中的信号通信的示例。通过这种方式,不同进程之间可以使用信号来进行简单的通信,例如进程之间的同步、控制等。
