信号通道

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

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

  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("-----")

 

posted on 2018-09-14 22:40  zengsf  阅读(342)  评论(0编辑  收藏  举报

导航