SIGINT,SIGKILL,SIGTERM
三者都是结束/终止进程运行.但略微有区别.
SIGINT
- 产生方式: 键盘Ctrl+C
- 产生结果: 只对当前前台进程,和他的所在的进程组的每个进程都发送
SIGINT
信号,之后这些进程会执行信号处理程序再终止.
SIGTERM
- 产生方式: 和任何控制字符无关,用
kill
函数发送 - 本质: 相当于
shell> kill
不加-9时 pid. - 产生结果: 当前进程会收到信号,而其子进程不会收到.如果当前进程被
kill
(即收到SIGTERM
),则其子进程的父进程将为init,即pid为1的进程. - 与
SIGKILL
的不同:SIGTERM
可以被阻塞,忽略,捕获,也就是说可以进行信号处理程序,那么这样就可以让进程很好的终止,允许清理和关闭文件.
SIGKILL
- 产生方式: 和任何控制字符无关,用
kill
函数发送 - 本质: 相当于
shell> kill -9 pid
. - 产生结果: 当前进程收到该信号,注意该信号时无法被捕获的,也就是说进程无法执行信号处理程序,会直接发送默认行为,也就是直接退出.这也就是为何
kill -9 pid
一定能杀死程序的原因. 故这也造成了进程被结束前无法清理或者关闭资源等行为,这样时不好的.
注意
由于SIGINT
, SIGTERM
都是可以被捕获的,也就是会执行信号处理函数的,故按照信号处理函数逻辑,可能进程不会退出,即不一定能终止,所以要处理好exit(0)
.
总结
-
SIGQUIT:
在POSIX兼容平台上,SIGQUIT是当用户请求进程执行核心转储时由其控制终端发送到进程的信号。 SIGQUIT通常可以用Control- \诱导。在Linux上,也可以使用Ctrl-4或在虚拟控制台上使用SysRq密钥。 -
SIGTERM:
SIGTERM是kill或killall命令发送到进程的默认信号。它会导致进程终止,但与SIGKILL信号不同,进程可以捕获并解释(或忽略)它。因此,SIGTERM类似于要求进程很好地终止,允许清理和关闭文件。出于这个原因,在关闭期间的许多Unix系统上,init向所有对关闭电源不重要的进程发出SIGTERM,等待几秒钟,然后发出SIGKILL强制终止剩余的任何此类进程。 -
SIGINT:
在POSIX兼容平台上,SIGINT是当用户希望中断进程时由其控制终端发送给进程的信号。当进程’控制终端上的用户按下正在运行的进程密钥 - 通常是Control-C,但在某些系统上,“删除”字符或“中断”键时,发送SIGINT。 -
SIGKILL:
在POSIX兼容平台上,SIGKILL是发送给进程的信号,使其立即终止。当发送到程序时,SIGKILL会立即终止它。与SIGTERM和SIGINT相反,此信号无法捕获或忽略,接收过程无法在接收到此信号时执行任何清理。
各种信号总结
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时
- SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控
制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端
不再关联. - SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出
- SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到
SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信
号. - SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行
数据段. 堆栈溢出时也有可能产生这个信号. - SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.
- SIGABRT 程序自己发现错误并调用abort时产生.
- SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.
- SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.
- SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.
- SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.
- SIGUSR1 留给用户使用
- SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.
- SIGUSR2 留给用户使用
- SIGPIPE Broken pipe
- SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.
- SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.
- SIGCHLD 子进程结束时, 父进程会收到这个信号.
- SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符
- SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
- SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
- SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
- SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.
- SIGURG 有"紧急"数据或out-of-band数据到达socket时产生.
- SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变
- SIGXFSZ 超过文件大小资源限制.
- SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
- SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.
- SIGWINCH 窗口大小改变时发出.
- SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.
- SIGPWR Power failure