SIGINT
和 SIGHUP
信号含义 到 nohup
和 &
的区别,逐步解释在计算机科学中,信号
是Unix、类Unix以及其余POSIX兼容的操做系统中进程间通信的一种有限制的方式。 它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操做系统中断了进程正常的控制流程,此时,任何非原子操做都将被中断。若是进程定义了信号的处理函数,那么它将被执行,不然就执行默认的处理函数。shell
经过kill -l命令得到
SIGINT信号session
程序终止(interrupt)信号, 在用户键入INTR字符(一般是Ctrl-C)时发出,用于通知前台进程组终止进程。异步
SIGHUP信号函数
本信号在用户终端链接(正常或非正常)结束时发出, 一般是在终端的控制进程结束时, 通知同一session内的各个做业, 这时它们与控制终端再也不关联。登陆Linux时,系统会分配给登陆用户一个终端(Session)。在这个终端运行的全部程序,包括前台进程组和后台进程组,通常都属于这个Session。当用户退出Linux登陆时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操做为终止进程,所以前台进程组和后台有终端输出的进程就会停止。此外,对于与终端脱离关系的守护进程,这个信号用于通知它从新读取配置文件。测试
ctrl + c 产生SIGINT信号,关闭shell窗口产生SIGHUP信号操作系统
测试代码以下:日志
用C写一个脚本,test.out,脚本内容以下:code
#include <stdio.h> void main() { int i=0; while(1){ printf("hello,%d\n", i++); sleep(1); } }
是一个输出hello与循环轮数的死循环程序,每输出一行就休眠1秒。进程
./test.out
程序每隔一秒会在终端输出一个字符串。事件
此时若是键入Ctrl+C ,程序会收到一个SIGINT信号,若是不作特殊处理,程序的默认行为是终止。
关闭 session, 程序会收到一个SIGHUP信号,若是不作特殊处理,程序的默认行为是终止。
运行程序时在命令后边加一个&
符号,&
的意思是在后台运行
执行脚本 ./test.out &
程序每隔一秒会在终端输出一个字符串。
查看进程号 ps -aux | fgrep test.out
此时键入Ctrl + C,发出SIGINT信号,程序会继续运行。(查看进程号,进程号依旧在,且进程号同样。)
若是关掉session,程序会收到一个SIGHUP信号, 进程终止。(查看进程号,进程不在。)
nohup: no hang up,不挂起,忽略SIGHUP信号。
执行脚本 nohup ./test.out
发现此时终端没有像以前那样,每隔一秒输出一个字符串
查看进程号 ps -aux | fgrep test.out
,进程存在。
此时键入Ctrl + C,发出SIGINT信号,程序终止。(查看进程号,进程不在。)
若是关掉session,程序会收到一个SIGHUP信号, 进程终止。(查看进程号,进程号依旧在,且进程号同样。)
- 结果会输出到终端; - 使用 Ctrl + C 发送SIGINT信号,程序免疫; - 关闭session发送SIGHUP信号,程序关闭
- 结果默认会输出到nohup.out(不会输出到终端); - 使用Ctrl + C 发送SIGINT信号,程序关闭; - 关闭 session 发送SIGHUP信号,程序免疫
因此,要想进程不受shell中Ctrl C和Shell窗口关闭的影响,就将nohup和&指令一块儿使用
nohup ./test.out &
同时免疫SIGINT和SIGHUP信号 。
通常不将nohup输出到 nohup.out 文件,若全部的nohup都输出到到该文件,则该文件会很大,而是将各自输出重定向其余的文件。(如日志文件)