python-司机和售票员

作业:
信号通信: 
    司机和售票员的故事
    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()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汽车司机售票员之间必须协同工作,一方面,只有售票员把车门关好了司机才能开车,因此,售票员关好车门应通知司机开车。另一方面,只有当司机已经停 下,售票员才能开门上下客,故司机停车后应通知售票员。假定某辆公共汽车上有两名售票员与一名司机,汽车当前正在始发站停车上客,试设必要的信号灯及赋初值,写出他们的同步过程 分析: 司机停车,通知售票员开门,售票员关门,通知司机开车 使用到的函数和信号量 HANDLE mutex; HANDLE empty; HANDLE full; 创建信号量 HANDLE CreateSemaphore( __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// lpSemaphoreAttributes是信号量的安全属性 可为NULL __in LONG lInitialCount,// lInitialCount是初始化的信号量 __in LONG lMaximumCount,// lMaximumCount是允许信号量增加到最大值 __in_opt LPCWSTR lpName//lpName是信号量的名称 可为NULL ); 创建互斥信号量 HANDLE CreateMutex(  LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 可为NULL  BOOL bInitialOwner, // 初始化互斥对象的所有者  LPCTSTR lpName // 指向互斥对象名的指针 ); 申请一个资源 WaitForSingleObject(HANDLE full,INFINITE); 释放资源 ReleaseSemaphore( __in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄 __in LONG lReleaseCount,// lReleaseCount是增加的计数。 __out_opt LPLONG lpPreviousCount//lpPreviousCount是增加前的数值返回。 ); 释放互斥信号量 BOOL ReleaseMutex(HANDLE hMutex); DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in array CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值