killip分级,范围kill

  killip分级,范围kill

  http://en.wikipedia.org/wiki/Category:Unix_signals

  1.SIGHUP信号

  在UNIX中,进程组织结构是session,它包含一个前台进程组和一个或多个后台进程组,一个进程组包含多个进程。会话可以具有会话头部过程,会话头部过程可以具有控制终端。一个过程组可以有一个过程组长。流程头流程的流程ID等于流程组ID。这里可能有一些,但在某些情况下没有。与终端交互的进程为前台进程,否则为后台进程。

  SIGHUP会在以下三种情况下被发送到相应的进程:

  1.当终端关闭时,信号被发送到第一个会话进程,该进程作为作业提交(即,带有符号提交的进程)。

  2.当第一个会话进程退出时,信号被发送到该会话中前台进程组中的每个进程。

  3.如果父进程退出,导致该进程形成一个孤立进程组,并且该进程组中有处于停止状态的进程(接收SIGSTOP或SIGTSTP信号),该信号将被发送到该进程组中的每个进程。

  系统SIGHUP信号的默认处理是终止接收信号的过程。因此,如果在程序中没有捕获到信号,当接收到信号时,进程将退出。

  观察以下由于终端关闭而导致进程退出的情况。这里,进程退出,因为它收到了SIGHUP信号。登录shell是第一个会话进程。

  首先,用下面的代码编写一个测试程序:

  #包含stdio.h

  #包含信号. h

  char * * args

  vodiexithandle(int SIG)

  {

  printf(%s : sighup received ,args[1]);

  }

  intmain(intargc,char**argv)

  {

  args=argv

  信号(SIGHUP,exit handle);

  pause();

  return0

  }

  程序在捕获SIGHUP信号后打印一条消息,pause()使程序暂停。

  编译后的可执行文件是sigtest。

  1.订单:sigtest front tt.txt

  操作:关闭终端。

  结果:tt.txt文件的内容是front: sighup received。

  原由:sigtest是前台进程。终端关闭后,按照上面提到的第一种情况,登录shell作为会话的第一个进程,会收到SIGHUP信号,然后退出。根据第二种情况,sigtest作为前台进程,将接收来自login shell的SIGHUP信号。

  2.订单:sigtest back tt.txt

  操作:关闭终端。

  结果:tt.txt文件的内容返回:sighup已接收。

  原文:sigtest是提交的作业,根据上面提到的第一种情况,sigtest会收到SIGHUP信号。

  3.命令:用[sigtest]的内容写一个shell,然后执行这个shell。

  操作:关闭终端。

  结果:ps -ef grep sigtest会看到进程还在,tt文件是空的。

  原原因:shell执行时,sigtest作为作业提交,然后shell退出,导致sigtest成为孤儿进程,不再是当前会话的作业。因此,sigtest既不是第一个会话进程,也不是作业,不会接收SIGHUP。同时,孤儿进程属于后台进程,所以login shell退出后不会向sigtest发送SIGHUP,因为它只向前台进程发送这个信号。第3条说,如果一个进程组成为孤儿进程组,如果任何一个进程处于停止状态,它也会收到SIGHUP信号,但是sigtest不处于停止状态,所以它不会收到SIGHUP信号。

  4.订单:TT nohupsigtest

  操作:关闭终端。

  结果:tt文件为空

  原文:nohup可以阻止进程接收SIGHUP信号。

  至此,我们知道了什么情况下终端关闭后进程会退出,什么情况下不会。

  有几种方法可以防止进程在终端关闭后退出,这些方法都是通过shell实现的:

  1.用以下内容编写一个shell

  Trap SIGHUP #这句话用来屏蔽SIGHUP信号。陷阱可以屏蔽很多信号。

  sigtest

  2.nohup sigtest可以直接在命令行上执行,

  如果您想在此操作后继续其他操作,您可以nohup sigtest。

  3.用以下内容编写一个shell

  sigtest

  实际上,可以使用任何方法将一个进程转换成孤儿进程,包括父进程在fork之后立即退出。

  2.信号信号

  子进程死亡后,它向父进程发送SIGCHLD信号。

  当一个进程调用exit命令结束它的生命时,并没有真正被销毁,而是留下了一个叫做僵尸的数据结构(系统调用exit,它的作用是让进程退出,但只限于把一个正常的进程变成僵尸进程,并不能完全销毁)。在Linux进程的状态中,僵尸进程是一个非常特殊的进程。它已经放弃了几乎所有的内存空间,没有可执行代码,无法调度。它只在进程列表中保留一个位置,记录进程的退出状态和其他信息,供其他进程收集。此外,僵尸进程不再占用任何内存空间。它需要它的父进程来收集它的尸体。如果它的父进程没有安装SIGCHLD信号处理函数来调用wait或waitpid()等待子进程结束,并且没有显式忽略信号,那么它就仍然是一个僵尸。如果父进程此时结束,那么init进程会自动接管子进程并收集它的尸体,它仍然可以被清除。但是如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么有时候系统中会有很多僵尸进程。

  2.信号项信号

  Kill()可以发送SIGTERM过去;默认情况下,kill命令也使用SIGTERM信号。

  SIG信号处理功能,常用于清理和退出;或者程序可以忽略这个信号,防止误杀。

  SIGTERM是killer kill all命令发送给进程的默认信号。它导致进程终止,但与SIGKILLsignal不同,它可以被进程捕获并解释(或忽略)。因此,SIGTERM更类似于要求一个进程很好地终止,允许清理和关闭文件。因此,在许多Unix系统上,在关机期间,init向所有对关机不重要的进程发出SIGTERM,等待几秒钟,然后发出SIGKILL来强制终止其他进程,以允许计算机暂停。

  Linux终止信号列表

  2009-04-13 17:00

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

  SIG trap SIG abrt SIG bus SIG fpe

  9)SIGKILL 10)sigus R1 11)SIGSEGV 12)sigus R2

  SIG pipe sigal RM SIGTERM SIGSTKFLT SIGCHLD

  18)SIG cont 19)SIGSTOP 20)SIGTSTP 21)sigt tin

  22)SIGTTOU 23)SIGURG 24)SIGXCPU 25)SIGXFSZ

  26)SIGVTALRM 27)SIG prof 28)SIG winch 29)SIGIO

  30)SIG PWR 31)SIG sys 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

  在列表中,编号为1 ~ 31的信号是传统的UNIX支持的信号,属于不可靠信号(非实时),编号为32 ~ 63的信号后来被扩展称为可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不支持。

  我们来讨论一下编号小于SIGRTMIN的信号。

  1) SIGHUP

  该信号在用户终端的连接(正常或异常)结束时发送。通常,当终端的控制过程结束时,通知同一会话中的所有作业,然后它们不再与控制终端相关联。

  当登录到Linux时,系统将为登录的用户分配一个会话。所有在这个终端运行的程序,包括前台进程组和后台进程组,一般都属于这个会话。当用户注销Linux时,前台进程组和有终端输出的后台进程都会收到SIGHUP信号。这个信号的默认操作是终止进程,所以前台进程组和有终端输出的后台进程都会被终止。但是,你可以捕捉到这个信号。比如wget可以捕捉SIGHUP信号并忽略它,这样即使你注销Linux,wget也可以继续下载。

  此外,该信号用于通知脱离终端的守护程序重新读取配置文件。

  2) SIGINT

  当用户键入INTR字符(通常是Ctrl-C)时发出的中断信号用于通知前台进程组终止进程。

  3)信号退出

  类似于SIGINT,但是由退出字符控制(通常是Ctrl-)。当进程由于接收SIGQUIT而退出时,会生成一个核心文件,在这个意义上类似于程序错误信号。

  4)印记

  执行了一条非法指令。通常,可执行文件本身存在错误,或者有人试图执行数据段。当堆栈溢出时,也可能产生该信号。

  5)信号陷阱

  由断点指令或其他陷阱指令生成。由调试器使用。

  6) SIGABRT

  调用中止函数产生的信号。

  7)信号总线

  非法地址,包括内存地址对齐错误。例如,访问一个长度为四个字的整数,但它的地址不是四的倍数。SIGSEGV和SIGSEGV的区别在于,后者是通过非法访问合法存储地址触发的(比如访问不属于自己的存储空间或者只读存储空间)。

  8) SIGFPE

  当发生致命的算术运算错误时发出。它不仅包括浮点运算错误,还包括溢出和除数0等所有其他算术错误。

  9)西格基尔

  用于立即结束程序。该信号不能被阻止、处理或忽略。如果管理员发现一个进程不能被终止,他可以尝试发送这个信号。

  10)信号1

  留给用户吧。

  11)西格夫

  尝试访问未分配的内存,或者尝试在没有写权限的情况下将数据写入内存地址。

  12) SIGUSR2

  留给用户吧。

  13)信号管

  管道坏了。该信号通常由进程间通信生成。比如两个使用FIFO (pipeline)通信的进程在读管道没有打开或者意外终止的情况下对管道进行写操作,写进程会收到SIGPIPE信号。另外,套接字通信有两个过程。当写进程正在写套接字时,读进程已经终止。

  14)信号

  时钟信号,计算实际时间或时钟时间。报警功能使用该信号。

  15) SIGTERM

  终止信号不同于SIGKILL,它可以被阻塞和处理。通常用于要求程序正常退出,shell命令kill默认生成此信号。如果进程无法终止,我们将尝试SIGKILL。

  17)西格德

  当子进程结束时,父进程将收到这个信号。

  如果父进程不处理这个信号,而是等待子进程,那么子进程在内核进程表中仍然有条目,尽管它被终止了。此时,子进程被称为僵尸进程。我们应该避免这种情况(父进程要么忽略SIGCHILD信号,捕获它,要么等待其子进程,要么父进程先终止,然后子进程的终止由init进程自动接管)。

  18)信号控制

  让停止的进程继续执行。这个信号是屏蔽不了的。当程序从停止状态变为继续执行时,可以使用处理程序来完成特定的作业。例如,再次显示提示。

  19)信号停止

  停止了进程的执行。注意它与终止和中断的区别:进程还没有结束,但是执行被挂起了。该信号不能被阻止、处理或忽略。

  20) SIGTSTP

  停止进程的运行,但是这个信号可以被处理和忽略。当用户键入SUSP字符(通常是Ctrl-Z)时,会发送此信号

  21)西格丁

  当后台作业要从用户终端读取数据时,作业中的所有进程都会收到SIGTTIN信号。默认情况下,这些进程将停止执行。

  22)西格图

  类似于SIGTTIN,但在写入终端(或修改终端模式)时接收。

  23)西格堡

  当数据到达套接字时,存在“紧急”数据或带外数据。

  24) SIGXCPU

  超过了CPU时间资源限制。该限值可通过getrlimit/setrlimit读取/更改。

  25) SIGXFSZ

  当进程试图放大文件,使其超过文件大小资源限制时。

  26)信号传输

  虚拟时钟信号。类似于SIGALRM,但是这个进程占用的CPU时间是计算出来的。

  27) SIGPROF

  类似于SIGALRM/SIGVTALRM,但包括该进程使用的CPU时间和系统调用时间。

  28)西格温

  当窗口大小改变时发出。

  29) SIGIO

  文件描述符已准备好进行输入/输出操作。

  30)信号功率放大器

  停电

  31) SIGSYS

  非法的系统调用。

  在上面列出的信号中,程序无法捕捉、阻止或忽略的信号有:SIGKILL、SIGSTOP。

  不能恢复到默认动作的信号有:SIGILL,SIGTRAP。

  会导致进程中止的默认信号有:sigabrt、sigbus、sigfpe、sigill、sigiot、sigquit、sigsegv、sigtrap、sigxcpu、sigxfsz。

  导致进程退出的默认信号有:sigalrm、sighup、sigint、sigkill、sigpipe、sigpoll、sigrof、sigsys、sigterm、sigusr1、sigusr2、sigvtalrm。

  导致进程停止的默认信号有:sigstop、sigtstp、sigttin、sigttou。

  进程默认忽略的信号有:SIGCHLD、SIGPWR、SIGURG、SIGWINCH。

  另外,SIGIO在SVR4中存在,在4.3BSD中被忽略;当进程暂停时,SIGCONT继续,否则它将被忽略并且不能被阻塞。

killip分级,范围kill