欢迎访问宙启技术站
智能推送

通过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中的信号通信的示例。通过这种方式,不同进程之间可以使用信号来进行简单的通信,例如进程之间的同步、控制等。