• 信号通道


    通道原理:
      一个进程向另一个进程发送一个信号来传递某种讯号,接受这根据收到的信号进行相应的行为

    在命令端可以用这两个命令来查看和发起信号

      kill -l 查看系统信号
      kill -sig PID 向一个进程发送信号

    一些常见的信号

      SIGHUP 断开连接
      SIGINT ctrl-c
      SIGQUIT ctrl-
      SIGTSTP ctrl-z
      SIGKILL 终止进程且不能被处理
      SIGSTOP 暂停进程且不能被处理
      SIGALRM 时钟信号
      SIGCHLD 子进程状态改变发送给父进程信息号

    一些常用的函数:

      os.kill(pid,sig)
        功能 : 发送一个信号给某个进程
        参数 : pid 给哪个进程发送信号
        sig 要发送什么信号

      signal.alarm(sec)
        功能: 设置时钟信号 在一定时间后给自身发送SIGALRM信号
        参数: sec 时间(秒)

        *不会阻塞,但发送的信号会影响到后面的程序
        * 一个进程中只能有一个时钟,后来的时候会覆盖前面的时间

      signal.pause()
        功能: 阻塞进程,等待一个信号

      signal.signal(sig,handler)
        功能 : 处理信号
        参数 : sig 要处理的信号
          handler 信号处理方法
        可选值 : SIG_DFL 表示使用默认方法处理
            SIG_IGN 表示忽略这个信号
            func 自定义函数
        自定义函数格式 : def func(sig,frame)
          sig : 接收到的信号
          frame: 信号结构对象from signal import *

    from time import sleep
    
    alarm(5)
    
    #进行的处理一定要有这两个参数
    #由于函数的形参会有signal传过来相对应的信号,因此可以利用信号进行相对应的动作
    def handler(sig, frame):
        if sig == SIGALRM:
            print("接收到时钟信号")
        elif sig == SIGINT:
            print("zengsf")
    
    
    #使用默认方法处理信号
    #signal.signal(signal.SIGINT, signal.SIG_DEF)
    
    #使用忽略信号
    #signal.signal(signal.SIGINT, signal.SIG_IGN)
    
    #利用函数进行处理
    signal(SIGALRM, handler)
    signal(SIGINT, handler)
    #需要一个循环,保证父进程一直存在
    while True: sleep(1) print("-----")
  • 相关阅读:
    使用jvisualvm和飞行记录器分析Java程序cpu占用率过高
    Callable、Future和FutureTask
    CountDownLatch(闭锁)
    ArrayBlockingQueue和LinkedBlockingQueue分析
    并发容器之CopyOnWriteArrayList(转载)
    svn 文件夹 无法提交
    rsync 不能同不子级目录的问题
    nginx 匹配.zip .apk 结尾的文件 直接下载
    Android文件Apk下载变ZIP压缩包解决方案
    nginx: [warn] conflicting server name "locahost" on 0.0.0.0:80, ignored
  • 原文地址:https://www.cnblogs.com/zengsf/p/9649329.html
Copyright © 2020-2023  润新知