zoukankan      html  css  js  c++  java
  • signal信号具体介绍,转载:https://www.cnblogs.com/zendu/p/4981406.html

    2) SIGINT
    程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
    3) SIGQUIT
    和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
    15) SIGTERM
    程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
    19) SIGSTOP
    停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

    =======

    ① SIGINT     终止进程     中断进程

    程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出。

    ② SIGQUIT    建立CORE文件终止进程,并且生成core文件

    ③ SIGQUIT 和 SIGINT 类似,但由QUIT字符(通常是Ctrl-)来控制;进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。

    ④ SIGKILL    终止进程     杀死进程

    ⑤ SIGPIPE    终止进程     向一个没有读进程的管道写数据

    ⑥ SIGALARM    终止进程     计时器到时

    ⑦ SIGTERM    终止进程     软件终止信号

    ⑧ SIGTERM 程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出。shell命令kill缺省产生这个信号。SIGTERM is the default signal sent to a process by the kill or killall commands.

    ⑨ SIGURG    忽略信号     I/O紧急信号

    ⑩ SIGIO    忽略信号     描述符上可以进行I/O

    11 SIGCHLD    忽略信号     当子进程停止或退出时通知父进程

    有两个信号可以停止进程:SIGTERM和SIGKILL。SIGTERM比较友好,进程能捕捉这个信号( it can be caught and interpreted (or ignored) by the process),根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

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

    ===========

    1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控

    制进程结束时, 通知同一session内的各个作业,这时它们与控制终端不再关联.

    2) SIGINT 程序终止(interrupt)信号,通常是从终端发出中断指令如ctrl+c或delete键

    3) SIGQUIT 和SIGINT类似,但由QUIT字符(通常是Ctrl+)来控制.进程在因收到

    SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号.

    4) SIGILL 执行了非法指令.通常是因为可执行文件本身出现错误,或者试图执行

    数据段. 堆栈溢出时也有可能产生这个信号.

    5) SIGTRAP 跟踪陷阱信号,由断点指令或其它trap指令产生.由debugger使用.

    6) SIGABRT 调用abort时产生的信号,将会使进程非正常结束。

    6) SIGIOT IO错误信号.

    7) SIGBUS 系统总线错误时产生的信号,非法地址,包括内存地址对齐(alignment)出错.eg: 访问一个四个字长

    的整数, 但其地址不是4的倍数.

    8) SIGFPE 在发生致命的算术运算错误时发出.不仅包括浮点运算错误,还包括溢

    出及除数为0等其它所有的算术的错误.

    9) SIGKILL 可以终止任何进程的信号,只能由管理员发出,该信号不会被捕捉和忽略。

    10) SIGUSR1 留给用户使用,用户可在应用程序中自行定义。

    11) SIGSEGV 试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据,非法使用内存地址信号。

    12) SIGUSR2 留给用户使用

    13) SIGPIPE 当一个进程对管道进行完读后进行写时产生的信号。

    14) SIGALRM 时钟定时信号,由alarm函数设定的时间终止时产生的信号。

    15) SIGTERM 程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理.通常用来要求程序自己正常退出.shell命令kill缺省产生这个信号.

    17) SIGCHLD 子进程结束或中断时产生该信号,父进程会收到这个信号.通过该信号父进程可以知道子进程的运行情况。但大多数情况下此信号会被忽略。

    18) SIGCONT 让一个停止(stopped)的进程继续执行.本信号不能被阻塞.

    19) SIGSTOP 停止(stopped)进程的执行.注意它和terminate以及interrupt的区别:

    该进程还未结束, 只是暂停执行.本信号不能被阻塞,处理或忽略.

    20) SIGTSTP 停止进程的运行,但该信号可以被处理和忽略.用户键入SUSP字符时

    (通常是Ctrl-Z)发出这个信号

    21) SIGTTIN 当后台作业要从用户终端读数据时,中断驱动器产生的信号。当读入数据的进程阻塞或忽略这个信号,或读取数据的进程所在进程组是一个孤立进程组时,信号不会发生,并且发生读错误。errno被设为ETO

    22) SIGTTOU 类似于SIGTTIN,当后台作业要从用户终端读数据时,中断驱动器产生的信号。当读入数据的进程阻塞或忽略这个信号,或读取数据的进程所在进程组是一个孤立进程组时,信号不会发生,并且发生读错误。errno被设为ETO。唯一不同的是进程可以选择后台写。

    23) SIGURG socket上出现紧急情况是发出的信息。

    24) SIGXCPU 超过CPU时间资源限制.这个限制可以由getrlimit/setrlimit来读取/改变

    25) SIGXFSZ 超过文件大小资源限制.

    26) SIGVTALRM 虚拟时钟信号.类似于SIGALRM,但是计算的是该进程占用的CPU时间.

    27) SIGPROF 类似于SIGALRM/SIGVTALRM,但包括该进程用的CPU时间以及系统调用的时间.

    28) SIGWINCH 窗口大小改变时发出.

    29) SIGIO 文件描述符准备就绪,可以开始进行输入/输出操作.

    30) SIGPWR Power failure 电源失效信号。

    31)SIGEMT实时硬件发生错误时产生的信号。

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

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

    注:有六个信号被称为作业信号,SIGCHLD,SIGCONT,SIGSTOP,SIGSTP,SIGTTNI,SIGTTOU.这些信号都是用于协调和组织各个进程的,也就是实现所谓的作业控制。通常情况下用户不需要对这些信号进行处理,shell会自动完成对这些信号的处理工作。信号之间是相互影响的,当进程接收到SIGCONT信号时,被系统悬挂的SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU将失效。同样进程接收到SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU时,SIGCONT将失效。

    参考:https://www.cnblogs.com/madsnotes/articles/5688681.html 

    ===========获取进程pid:pid = os.getpid()

    1. #可以通过$kill命令来向某个进程发出信号:16175是前面那个绑定信号处理函数的pid,需要自行修改: os.kill(16175,signal.SIGTERM)
       
      2、  man 7 signal
       

       3、

      SIGINT   当键盘按下CTRL+C从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是中断 (INTERRUPT) 该进程。

      SIGQUIT  当键盘按下CTRL+从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是退出 (QUIT) 该进程。

      SIGTSTP  当键盘按下CTRL+Z从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是暂停 (STOP) 该进程。

      SIGCONT  用于通知暂停的进程继续。

      SIGALRM  起到定时器的作用,通常是程序在一定的时间之后才生成该信号。如下:

      import signal
      # Define signal handler function
      def myHandler(signum, frame):
          print("Now, it's the time")
          exit()
      
      # register signal.SIGALRM's handler 
      signal.signal(signal.SIGALRM, myHandler)
      signal.alarm(5)
      while True:
          print('not yet')

      我们这里用了一个无限循环以便让进程持续运行。在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。
      除了signal.alarm()向自身发送信号之外,并没有其他发送信号的功能。可以通过kill命令向进程和进程组发送信号

      os.kill(pid, sid)

      os.killpg(pgid, sid) sid为信号所对应的整数或者singal.SIG*

       4、

      signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,如下所示:

      singnal.signal(signalnum, handler) 

      signalnum为某个信号,handler为该信号的处理函数。我们在信号基础里提到,进程可以无视信号,可以采取默认操作,还可以自定义操作。当handler为signal.SIG_IGN时,信号被无视(ignore)。当handler为singal.SIG_DFL,进程采取默认操作(default)。当handler为一个函数名时,进程采取函数中定义的操作。

      Handler的两个参数一个用来识别信号(signum),另一个用来获得信号发生时,进程栈的状况(stack frame)。这两个参数都是由signal.singnal()函数来传递的,如:

      def myHandler(signum, frame):
          print('I received: ', signum)

      5、signal.pause() 是当前进程暂停,等待信号

       6、 信号所能传递的信息比较粗糙,只是一个整数。信号经常地用于通知进程终结、中止或者恢复等等。

      它可以是内核自身产生的,也可以是其它进程产生的,发送给内核,再由内核传递给目标进程。

       
  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/testzcy/p/12553049.html
Copyright © 2011-2022 走看看