这里使用fork方法,当然也可以使用Process创建子进程,此时join就可以保证,父进程随子进程退出而退出,但没有测试

【代码】signal 父子进程通信
第一个CTRL+Z退出子进程,需要第二次CTRL+Z退出父进程,且退出方式都是sys.exit方法
存在以下问题:s.signal(s.SIGCLD, s.SIG_IGN)这句作用不理解作用,设置成s.SIG_DFL则使得子进程和父进程都无法退出,只能htop再kill

#!/usr/bin/python3

import time
import os
from os import kill
import sys
import signal as s
from multiprocessing import Process, Value, Array, Event

def seller_handle(signum, frame):
    if signum==s.SIGINT:
        print('CTRL C',int(signum))
        kill(os.getppid(),s.SIGUSR1)
    elif signum==s.SIGQUIT:
        print('CTRL \\' ,int(signum))
        kill(os.getppid(),s.SIGUSR2)
    elif signum==s.SIGUSR1:
        sys.exit('arrived')
def driver_handle(signum, frame):
    if signum==s.SIGTSTP:
        print('CTRL Z'  ,int(signum))
        try:
            # 如果子进程退出,则在shell使用CTRL+Z使得这句报错,然而父进程此时正好需要CTRL+Z来退出程序
            kill(pid,s.SIGUSR1)
        except ProcessLookupError as e:
            print(e)
            sys.exit('exited.')
    elif signum==s.SIGUSR1:
        print('action...')
    elif signum==s.SIGUSR2:
        print('safety attention...')

def driver():
    s.signal(s.SIGQUIT, s.SIG_IGN)
    s.signal(s.SIGINT, s.SIG_IGN)

    s.signal(s.SIGTSTP, driver_handle)
    s.signal(s.SIGUSR1, driver_handle)
    s.signal(s.SIGUSR2, driver_handle)

    s.signal(s.SIGCLD, s.SIG_IGN)
    while True:
        time.sleep(1)

def seller():
    s.signal(s.SIGTSTP, s.SIG_IGN)

    s.signal(s.SIGINT, seller_handle)
    s.signal(s.SIGQUIT, seller_handle)
    s.signal(s.SIGUSR1, seller_handle)
    while True:
        time.sleep(1)

pid = os.fork()

if pid==0:
    seller()
else:
    driver()

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-22
  • 2021-12-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-24
  • 2022-01-14
  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2022-12-23
相关资源
相似解决方案