作业:
信号通信:
司机和售票员的故事
1,创建父子进程,分别表示司机和售票员
2,当售票员捕捉到SIGINT时,给司机发送SIGUSER1信号,此时司机打印"老司机开车了"
3,当售票员捕捉到SIGQUIT时,给司机发送SIGUSER2信号,此时司机打印'系好安全带,车速有点快'
4,当司机捕捉到SIGTSTP时,发送SIGUSER1给售票员,售票员打印,到站了,请下车
5,到站后,售票员先下车(子进程先退出,司机后退出)
温馨提示:
键盘发送信号会发送给终端的所有进程
#!/usr/bin/python3
#coding:utf-8
import signal
import os
import sys
from multiprocessing import Process
from time import sleep
#自定义售票员函数,捕获信号,并将其交给conductor_handler处理
def conductor():
print('我是售票员')
signal.signal(signal.SIGINT, conductor_handler)
signal.signal(signal.SIGQUIT, conductor_handler)
signal.signal(signal.SIGTSTP, signal.SIG_IGN)
signal.signal(signal.SIGUSR1, conductor_handler)
while True:
sleep(1)
#用来处理售票员接收到的信号
def conductor_handler(sig,frame):
if sig == signal.SIGINT:
os.kill(os.getppid(), signal.SIGUSR1)
elif sig == signal.SIGQUIT:
os.kill(os.getppid(), signal.SIGUSR2)
elif sig == signal.SIGUSR1:
print('到站了,请下车')
sys.exit(0)
else:
pass
#司机,捕获信号,因为键盘的信号主线程和子线程都会接收,所以两边都要处理;忽略SIGINT,SIGQUIT信号
def driver():
print('我是老司机')
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGQUIT, signal.SIG_IGN)
signal.signal(signal.SIGTSTP, driver_handler)
signal.signal(signal.SIGUSR1, driver_handler)
signal.signal(signal.SIGUSR2, driver_handler)
def driver_handler(sig, frame):
if sig == signal.SIGTSTP:
os.kill(p.pid, signal.SIGUSR1)
elif sig == signal.SIGUSR1:
print('老司机开车了')
elif sig == signal.SIGUSR2:
print('系好安全带,车速有点快')
p = Process(target=conductor, name='tony')
p.start()
driver()
p.join()