python主进程接收信号,子进程发送信号

代码:

import multiprocessing
import signal
import time
import sys
import os

'''
signal.SIGINT 是由键盘输入产生的信号,通常通过按下 Ctrl+C 来触发,用于请求程序中断。
signal.SIGTERM 是由操作系统发送的终止信号,通常用于请求程序终止。在 Unix/Linux 系统中,kill 命令默认发送 SIGTERM 信号。
'''

def handler1():
    # 获取当前进程的PID
    pid = os.getpid()
     
    # 打印当前进程ID
    print(f"子进程ID: {pid}")

    # 假设在这里做一些工作
    time.sleep(2)
     
    # 尝试杀死当前进程
    try:
        os.kill(pid, signal.SIGTERM)
    except OSError:
        print("无法杀死进程,进程可能已经结束。")
     
    # 等待操作系统杀死进程
    time.sleep(1)

def handler2():
    # 获取当前进程的PID
    pid = os.getpid()
     
    # 打印当前进程ID
    print(f"子进程ID: {pid}")

    # 假设在这里做一些工作
    time.sleep(2)
     
    # 尝试杀死当前进程
    try:
        os.kill(pid, signal.SIGINT)
    except OSError:
        print("无法杀死进程,进程可能已经结束。")
     
    # 等待操作系统杀死进程
    time.sleep(1)

def signal_handler(signum, frame):
    print(f"主进程获取到一个信号{signum}")
    #print(frame)

def main():
    signal.signal(signal.SIGTERM, signal_handler) # 设置信号处理函数
    signal.signal(signal.SIGINT, signal_handler) # 设置信号处理函数
    
    p = multiprocessing.Process(target=handler1, name='sub process')
    p.start()
    
    p = multiprocessing.Process(target=handler2, name='sub process')
    p.start()
    
    #signal.pause() # 主进程阻塞式等待信号
    time.sleep(5)

if __name__ == '__main__':
    main()

 

输出:

子进程ID: 55575
主进程获取到一个信号15
子进程ID: 55576
主进程获取到一个信号2

 

https://docs.python.org/zh-cn/3.9/library/signal.html

https://docs.python.org/zh-cn/3.9/library/ipc.html

posted @ 2024-12-25 22:21  河北大学-徐小波  阅读(10)  评论(0编辑  收藏  举报