• 信号的概念


    信号的概念

    信号(signal)--     进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

    几个常用信号:

    SIGINT     终止进程  中断进程  (control+c)

    SIGTERM   终止进程     软件终止信号

    SIGKILL   终止进程     杀死进程

    SIGALRM 闹钟信号

    进程结束信号 SIGTERM和SIGKILL的区别

    SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

    对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

    发送信号一般有两种原因:

    1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号

    2(主动式)  通过系统调用kill来向指定进程发送信号

    操作系统规定了进程收到信号以后的默认行为

    但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为

    有两个信号是不可更改的SIGTOP和SIGKILL

    绑定信号处理函数

    import os  
    import signal  
    from time import sleep  
       
    def onsignal_term(a,b):  
        print '收到SIGTERM信号'  
       
    #这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面  
    signal.signal(signal.SIGTERM,onsignal_term)  
       
    def onsignal_usr1(a,b):  
        print '收到SIGUSR1信号'  
    #这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面  
    signal.signal(signal.SIGUSR1,onsignal_usr1)  
       
    while 1:  
        print '我的进程id是',os.getpid()  
        sleep(10)  

    运行该程序。然后通过另外一个进程来发送信号。

    发送消息的代码如下:
     
    import os  
    import signal  
       
    #发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改  
    os.kill(16175,signal.SIGTERM)  
    #发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改  
    os.kill(16175,signal.SIGUSR1) 
     
    使用信号需要特别注意的地方

    如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

    所以,尽量不要在多线程中使用信号。

    这个不妥,测试没发现有信号丢失

    例子演示:

    接收信号的程序,你会发现如果有另外一端使用多线程向这个进程发送信号,会遗漏一些信号。

  • 相关阅读:
    VC 使用json cpp 静态库 问题解决
    <转>c++ builder JSONCPP 注意事项 XE2 解决编译问题 _Mfl
    窥探try ... catch与__try ... __except的区别
    二叉树与其它树
    《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
    《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
    《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记
    windows lua 多线程 线程同步
    <转>多线程中的lua同步问题
    php 检查email电子邮件函数(奇葩写法)
  • 原文地址:https://www.cnblogs.com/Vito2008/p/5190174.html
Copyright © 2020-2023  润新知