进程通信-signal应用(司机售票员)

【1】创建父子进程分别表示司机和售票员

【2】当售票员捕捉到SIGINT信号时,给司机发送SIGUSER1信号

    此时司机打印 "老司机开车了"

【3】当售票员捕捉到SIGQUIT信号时,给司机发送SIGUSER2信号。

    此时司机打印 "车速有点快,系好安全带"

【4】当司机捕捉到SIGTSTP信号时,给售票员发送SIGUSER1信号。

    此时售票员打印 "到站了请下车" 

【5】到站后, 售票员先下车(子进程先退出)然后司机下车

import multiprocessing as mp 
from signal import * 
import os 
from time import sleep 

#子进程出处理信号
def saler_handler(sig,frame):
    if sig == SIGINT:
        os.kill(os.getppid(),SIGUSR1)
    elif sig == SIGQUIT:
        os.kill(os.getppid(),SIGUSR2)
    elif sig == SIGUSR1:
        print("到站了,请下车")
        os._exit(0)

def driver_handler(sig,frame):
    if sig == SIGUSR1:
        print("老司机,开车了")
    elif sig == SIGUSR2:
        print("车速有点快,系好安全带")
    elif sig == SIGTSTP:
        os.kill(p.pid,SIGUSR1)

#创建子进程表示售票员
def saler():
    signal(SIGINT,saler_handler)
    signal(SIGQUIT,saler_handler)
    signal(SIGUSR1,saler_handler)
    signal(SIGTSTP,SIG_IGN)
    while True:
        sleep(2)
        print("Python 带你去远方看晴空万里")

p = mp.Process(target = saler)
p.start()

signal(SIGUSR1,driver_handler)
signal(SIGUSR2,driver_handler)
signal(SIGTSTP,driver_handler)
signal(SIGINT,SIG_IGN)
signal(SIGQUIT,SIG_IGN)

p.join()

 

posted @ 2021-01-11 12:17  昱成  阅读(217)  评论(0编辑  收藏  举报