1. 程式人生 > 實用技巧 >程序通訊-signal應用(司機售票員)

程序通訊-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()