当前位置: 移动技术网 > IT编程>脚本编程>Python > 信号signal

信号signal

2018年08月31日  | 移动技术网IT编程  | 我要评论

海里有什么,家庭女人最后的离别,校服的裙摆下载

信号的概念

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

几个常用信号:

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

sigterm   终止进程     软件终止信号

sigkill   终止进程     杀死进程

sigalrm 闹钟信号

 

进程结束信号 sigterm和sigkill的区别

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

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

 

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

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

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

 

 

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

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

有两个信号是不可更改的sigtop和sigkill

绑定信号处理函数:

 

  1.  
    import os
  2.  
    import signal
  3.  
    from time import sleep
  4.  
     
  5.  
    def onsignal_term(a,b):
  6.  
    print '收到sigterm信号'
  7.  
     
  8.  
    #这里是绑定信号处理函数,将sigterm绑定在函数onsignal_term上面
  9.  
    signal.signal(signal.sigterm,onsignal_term)
  10.  
     
  11.  
    def onsignal_usr1(a,b):
  12.  
    print '收到sigusr1信号'
  13.  
    #这里是绑定信号处理函数,将sigusr1绑定在函数onsignal_term上面
  14.  
    signal.signal(signal.sigusr1,onsignal_usr1)
  15.  
     
  16.  
    while 1:
  17.  
    print '我的进程id是',os.getpid()
  18.  
    sleep(10)

 

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

发送消息的代码如下:
  1.  
    import os
  2.  
    import signal
  3.  
     
  4.  
    #发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
  5.  
    os.kill(16175,signal.sigterm)
  6.  
    #发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
  7.  
    os.kill(16175,signal.sigusr1)

使用信号需要特别注意的地方:

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

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

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

例子演示:

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网