nohup代码分析

很多习惯启动一个程序或者shell时,用nohup加程序的方式启动,让程序以deamon的方式在后台去运行,其实nohup的代码很简单,做的事情不多,一起去简单看一下。

首去去判断当前标准输入,输出,以及错误输出的文件描述符是否是一个终端,接着如果是在终端里运的话。

nohup代码分析

修改标准输入,打开/dev/null,作为进程的标准输入。

nohup代码分析

打开nohup.out作为标准输出,优先在当前目录创建,如果失败,则在用户家目录创建nohup.out。

nohup代码分析

将标准错误输出也定向到nohup.out文件中。

nohup代码分析

上面就是nohup的关键代码了,首先向系统注册一个SIGHUP信号,处理方式是忽略,系统默认的方式kill进程,接着execvp函数执行参数后面的进程。

为什么这样可以做到把代码放到后台运行呢,不让进程不因SIGHUP信号而终止呢,得弄清楚什么时候系统会向进程发送SINHUP信号呢,其实在posix标准里,linux也遵守这个标准,当用户在连接上linux终端后,当当前会话终端中断时,系统会向当前会话的前台进程组发送一个SIGHUP信号,系统默认对这个信号的处理方式是KILL该进程,如果进程忽视这个信号,没有被kill的话,接着系统会再次向该进程发送一个SIGCONT信号,nohup的作用就是让程序忽视SIGHUP信号,避免终端连接中断时,进程被kill,同时改变进程标准输入输出。

其实有没有必要一定用nohup方式去启动后台进程呢,我觉得没有必要,当一个会话的终端中断后,系统只会给当前会话的前台进程组发送SIGHUP信号,如果启动进程时,让进程在后台去执行,也是执行的时候后面加一个&,也可以自己去重定向输入输出,会话的终端中断时,后台的进程组是不会收到SIGHUP信号,也就不会被系统kill掉,当然也可以在代码里注册SIGHUP该信号,防止进程被kill。

你可能感兴趣的:(后台启动,daemon启动,nohup原理,SIGHUP信号,nohup代码)