进程通信-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()