程序通訊-signal應用(司機售票員)
阿新 • • 發佈:2021-01-11
【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()