美文网首页
Python signal 信号模块和进程

Python signal 信号模块和进程

作者: 河码匠 | 来源:发表于2019-07-16 14:43 被阅读0次

    一、什么是信号

    软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用 kill 发送软中断信号。

    内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

    注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

    1. 进程对信号的处理方法

    • 第一种方法:类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。

    • 第二种方法:忽略某个信号,对该信号不做任何处理,就象未发生过一样。

    • 第三种方法:对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用 signal 来指定进程对某个信号的处理行为。

    ------ 以上来自百度百科 ------

    2. 查询信号 kill -l

    3. 给进程发信号 kill -信号值 pid

    二、Python signal 信号模块

    1. 常见的信号类型

    信号名 描述
    signal.SIGHUP 连接挂断,一般是在用户终端连接结束时发出。
    signal.SIGILL 非法指令,在进程试图执行一些非法指令时(比如可执行文件发生错误)发出
    signal.SIGINT 终止进程(ctrl + c)
    signal.SIGTSTP 暂停进程(ctrl + z)
    signal.SIGKILL 特殊信号,杀死一个进程。这个不能被堵塞、处理或忽略
    signal.SIGSTOP 特殊行啊,暂停一个进程。这个不能被堵塞、处理或忽略
    signal.SIGQUIT 终端退出(ctrl + \)
    signal.SIGTERM 终止信号,软件终止信号
    signal.SIGALRM 闹钟信号,由 signal.alarm() 发起
    signal.SIGCONT 继续执行暂停进程

    2. 常用的方法

    • signal.alarm(time) 叫做闹钟或者报警器

    time(单位秒)时间后终止程序

    示例:

    #!coding=utf-8
    import signal
    import time
    
    signal.alarm(5)
    
    for i in range(10):
        print i
        time.sleep(1)
    

    这里面 signal.alarm(5) 是程序只执行5秒

    结果如下

    0
    1
    2
    3
    4
    [Finished in 5.9s with exit code -14]
    

    \color{red}{注意}:在一个进程中只能设置一个 signal. alarm(time),如果设置第二个则会覆盖第一个的时间。

    • signal.pause() 暂停进程直到出现一个信号

    signal.pause() 会把进程暂停且等待出现任何一个信号后,执行 signal.pause() 后面的语句。

    示例

    #!coding=utf-8
    import signal
    import time
    
    signal.alarm(5)
    signal.pause()
    
    for i in range(10):
        print i
        time.sleep(1)
    

    没有信号的情况下,不会执行 for 循环。而且 5 秒后自动结束。

    • signal.signal(sig, handler) 信号处理函数
    函数 说明 参数
    signal.signal(sig, handler) 信号处理函数 参数:
    handler:
    SIG_IGN:信号被忽略
    SIG_DFL: 进程采用默认行为处理
    function: 传入一个函数,自定义处理过程
    SIGSTOP SIGKILL: 不能处理,只能采用

    示例:无视 CTRL+C 操作

    #!coding=utf-8
    import signal
    
    signal.alarm(10)
    
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    
    signal.pause()
    

    在这10秒期间 CTRL+C 无效。10秒后自动关闭。

    示例:函数处理信号

    #!coding=utf-8
    import signal
    import time
    
    def func(signum, frame):
        if signum == signal.SIGALRM:
            print('alarm SIGALRM 信号')
        elif signum == signal.SIGINT:
            print("CTRL+C  SIGINT 信号")
    
    signal.alarm(5)
    signal.signal(signal.SIGINT, func)
    signal.signal(signal.SIGALRM, func)
    
    while True:
        print('循环...')
        time.sleep(1)
    

    相关文章

      网友评论

          本文标题:Python signal 信号模块和进程

          本文链接:https://www.haomeiwen.com/subject/ckkhkctx.html