新濠天地 > c语言 > 【新濠天地】是一种软件中断,SIGKILL   终止进

原标题:【新濠天地】是一种软件中断,SIGKILL   终止进

浏览次数:190 时间:2019-09-20

信号的概念

实信号(signal)--     进程之间通信的主意,是一种软件中断。一个进程一旦接收到确定性信号就能够堵塞原本的程序施行流程来管理确定性信号。

多少个常用复信号:

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

SIGTERM   终止进度     软件终止确定性信号

SIGKILL   终止进度     杀死进程

SIGALRM 机械钟时限信号

 

初步精通Python进程的随机信号通信,python进度非确定性信号

时域信号的定义

时限信号(signal)--     进度之间通信的诀要,是一种软件中断。五个历程一旦接到到频限信号就能阻塞原本的程序试行流程来拍卖复信号。

多少个常用时域信号:

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

SIGTERM   终止进度     软件终止非确定性信号

SIGKILL   终止进度     杀死进程

SIGALRM 时钟功率信号
进程甘休信号 SIGTERM和SIGKILL的界别

SIGTERM相比较和谐,进度能捕捉这一个实信号,依照你的内需来关闭程序。在关闭程序此前,您能够结束打开的记录文件和变成正在做的天职。在有些情状下,假使进度正在张开课业并且不能暂停,那么进程能够忽略那么些SIGTERM时域信号。

对于SIGKILL功率信号,进度是不可以小看的。那是一个“小编随意您在做如何,登时停下”的复信号。借使你发送SIGKILL功率信号给进程,Linux就将经过甘休在那里。
出殡复信号一般有二种原因:

1(被动式)  内核检查评定到二个系统事件.比方子进度退出会像父进程发送SIGCHLD功率信号.键盘按下control+c会发送SIGINT时限信号

2(主动式)  通过系统调用kill来向内定进度发送复信号
linux操作系统提供的确定性信号

[[email protected] myppt]$ kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL

 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE

 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT

17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU

25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH

29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN

35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4

39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6

59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

Python提供的能量信号

Python 2.4.3 (#1, Jun 11 2009, 14:09:58)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import signal

>>> dir(signal)

['NSIG', 'SIGABRT', 'SIGALRM', 'SIGBUS', 'SIGCHLD', 'SIGCLD', 'SIGCONT', 'SIGFPE', 'SIGHUP', 'SIGILL', 'SIGINT', 'SIGIO', 'SIGIOT', 'SIGKILL', 'SIGPIPE', 'SIGPOLL', 'SIGPROF', 'SIGPWR', 'SIGQUIT', 'SIGRTMAX', 'SIGRTMIN', 'SIGSEGV', 'SIGSTOP', 'SIGSYS', 'SIGTERM', 'SIGTRAP', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU', 'SIGURG', 'SIGUSR1', 'SIGUSR2', 'SIGVTALRM', 'SIGWINCH', 'SIGXCPU', 'SIGXFSZ', 'SIG_DFL', 'SIG_IGN', '__doc__', '__name__', 'alarm', 'default_int_handler', 'getsignal', 'pause', 'signal']

操作系统规定了经过收到功率信号未来的私下认可行为

唯独,大家能够经过绑定随机信号管理函数来修改进程收到非能量信号现在的一颦一笑

有四个实信号是不可改造的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)  

SIGCHLD信号

下一场呈现二个子进程甘休后自动向父进程发送SIGCHLD时限信号的例子。

  ''''''' 
  子进程结束会向父进程发送SIGCHLD信号 
  '''  
  import os  
  import signal  
  from time import sleep  

  def onsigchld(a,b):  
    print '收到子进程结束信号'  
  signal.signal(signal.SIGCHLD,onsigchld)  

  pid = os.fork()  
  if pid == 0:  
    print '我是子进程,pid是',os.getpid()  
    sleep(2)  
  else:  
    print '我是父进程,pid是',os.getpid()  
    os.wait() #等待子进程结束  

采纳时限信号必要非常注意的地方:

要是三个历程收到四个SIGUS奥迪Q51时域信号,然后实施实信号绑定函数,第三个SIGUS宝马7系2时域信号又来了,第一个信号从未被处理完成的话,第三个时域信号就能够放弃。

故而,尽量不要在十六线程中央银行使连续信号。

那么些不妥,测量检验没察觉有非功率信号错失

事例演示:

收下频域信号的顺序,你会发觉只要有其他一端应用四线程向这一个历程发送时限信号,会管窥蠡测一些实信号。

  import os  
  import signal  
  from time import sleep  
  import Queue  

  QCOUNT = Queue.Queue() #初始化队列  

  def onsigchld(a,b):  
    '''''''收到信号后向队列中插入一个数字1'''  
    print '收到SIGUSR1信号'  
    sleep(2)  
    QCOUNT.put(1) #向队列中写入  

  def exithanddle(s,e): 
    raise SystemExit('收到终止命令,退出程序')  

  signal.signal(signal.SIGUSR1,onsigchld) #绑定信号处理函数  
  signal.signal(signal.SIGINT,exithanddle) #当按下Ctrl + C 终止进程 

  while 1:  
    print '我的pid是',os.getpid()  
    print '现在队列中元素的个数是',QCOUNT.qsize()  
    sleep(2) 

四线程发复信号端的程序:

 

  ''''''' 
  使用多线程向另外一个进程发送信号 
  '''  
  import threading  
  import os  
  import signal  

  def sendusr1():  
    print '发送信号'  
    #这里的进程id需要写前一个程序实际运行的pid  
    os.kill(17788, signal.SIGUSR1)  

  WORKER = []  

  #开启6个线程  
  for i in range(1, 7):  
    threadinstance = threading.Thread(target = sendusr1)  
    WORKER.append(threadinstance)  

  for i in WORKER:  
    i.start()  

  for i in WORKER:  
    i.join()  

  print '主线程完成'  

内容增补:

Alarms 是贰个非同一般实信号类型,它可以让程序需求系统通过一段时间对友好发送文告。os 标准模块中提议,它可用来幸免无界定阻塞 I/O 操作或任何系统调用。

像下边例子,原本程序睡眠 10 后才打字与印刷出 print 'After :', time.ctime(),不过由于 signal.alarm(2),所以 2 秒后就实施了打字与印刷。

  import signal 
  import time 

  def receive_alarm(signum, stack): 
    print 'Alarm :', time.ctime() 

  # Call receive_alarm in 2 seconds 
  signal.signal(signal.SIGALRM, receive_alarm) 
  signal.alarm(2) 

  print 'Before:', time.ctime() 
  time.sleep(10) 
  print 'After :', time.ctime()  

瞩目Signal唯有主线程技艺吸收接纳复信号,像下边例子,print 'Done waiting' 语句打印不出去,假设不调用 signal.alarm(2) ,程序将长久阻塞

  import signal 
  import threading 
  import os 
  import time 

  def signal_handler(num, stack): 
    print 'Received signal %d in %s' %  
      (num, threading.currentThread().name) 

  signal.signal(signal.SIGUSR1, signal_handler) 

  def wait_for_signal(): 
    print 'Waiting for signal in', threading.currentThread().name 
    signal.pause() 
    print 'Done waiting' 

  # Start a thread that will not receive the signal 
  receiver = threading.Thread(target=wait_for_signal, name='receiver') 
  receiver.start() 
  time.sleep(0.1) 

  def send_signal(): 
    print 'Sending signal in', threading.currentThread().name 
    os.kill(os.getpid(), signal.SIGUSR1) 

  sender = threading.Thread(target=send_signal, name='sender') 
  sender.start() 
  sender.join() 

  # Wait for the thread to see the signal (not going to happen!) 
  print 'Waiting for', receiver.name 
  signal.alarm(2) 
  receiver.join() 

再有少数亟待注意的是,即使 alarms 类数字信号能够在任何线程中调用,但是只可以在主线程中收到,像上边例子正是子线程 use_alarm 中调用  signal.alarm(1) ,但是不起成效 :

  import signal 
  import time 
  import threading 

  def signal_handler(num, stack): 
    print time.ctime(), 'Alarm in', threading.currentThread().name 

  signal.signal(signal.SIGALRM, signal_handler) 

  def use_alarm(): 
    t_name = threading.currentThread().name 
    print time.ctime(), 'Setting alarm in', t_name 
    signal.alarm(1) 
    print time.ctime(), 'Sleeping in', t_name 
    time.sleep(3) 
    print time.ctime(), 'Done with sleep in', t_name 

  # Start a thread that will not receive the signal 
  alarm_thread = threading.Thread(target=use_alarm, 
                  name='alarm_thread') 
  alarm_thread.start() 
  time.sleep(0.1) 

  # Wait for the thread to see the signal (not going to happen!) 
  print time.ctime(), 'Waiting for', alarm_thread.name 
  alarm_thread.join() 

  print time.ctime(), 'Exiting normally' 

复信号的定义 连续信号(signal)-- 进度之间通信的艺术,是一种软件中断。二个经过一旦接到到信...

经过甘休时限信号 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):

  1.  

    print '收到SIGTERM信号'

  2.  

     

  3.  

    #这里是绑定实信号管理函数,将SIGTERM绑定在函数onsignal_term上面

  1.  

    signal.signal(signal.SIGTERM,onsignal_term)

  2.  

     

  3.  

    def onsignal_usr1(a,b):

  1.  

    print '收到SIGUSR1信号'

  2.  

    #此间是绑定连续信号管理函数,将SIGUSENVISION1绑定在函数onsignal_term上面

  1.  

    signal.signal(signal.SIGUSR1,onsignal_usr1)

  2.  

     

  3.  

    while 1:

  1.  

    print '作者的进程id是',os.getpid()

  2.  

    sleep(10)

 

运行该程序。然后通过别的四个经过来发送连续信号。

出殡消息的代码如下:

  1.  

    import os

  2.  

    import signal

  3.  

     

  4.  

    #发送能量信号,16175是前面那么些绑定实信号管理函数的pid,需求活动修改

  1.  

    os.kill(16175,signal.SIGTERM)

  2.  

    #发送时域信号,16175是前方那么些绑定非能量信号管理函数的pid,要求活动修改

  1.  

    os.kill(16175,signal.SIGUSR1)

利用非信号需求极度注意的地点:

一经一个经过收到三个SIGUS奥迪Q51时域信号,然后试行随机信号绑定函数,首个SIGUS奇骏2频域信号又来了,第多少个功率信号未有被管理实现的话,第一个复信号就能够扬弃。

就此,尽量不要在八线程中运用非复信号。

以此不妥,测量检验没发掘有实信号遗失

事例演示:

选取非能量信号的前后相继,你会开采只要有别的一端选取二十四线程向那几个历程发送非确定性信号,会孤陋寡闻一些非随机信号。

 

本文由新濠天地发布于c语言,转载请注明出处:【新濠天地】是一种软件中断,SIGKILL   终止进

关键词:

上一篇:没有了

下一篇:没有了