欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

信号signal

程序员文章站 2023-12-26 21:36:15
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。 几个常用信号: SIGINT 终止进程 中断进程 (control+c) SIGTERM 终止进程 软件终止信号 SIGKILL 终止进程 杀死进程 SIGALRM ......

信号的概念

信号(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信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

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

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

例子演示:

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

 

上一篇:

下一篇: