nohup代码分析

1.当交互bash退出的时候,比如exit或logout,它会发送SIGHUP到它的所有作业,作业下的所有子进程都会收到SIGHUP。

2.当终端挂断的时候,终端驱动会发送SIGHUP到它的控制进程,通常我们登录后控制进程就是bash,它收到SIGHUP,然后退出,退出的过程参1

3.显然不想让一个进程被bash发送的SIGHUP中止通常用三种方法:
  a.自己处理SIGHUP
  b.忽略SIGHUP(用nohup命令或disown -h)

  c.脱离交互bash的作业(比如用disown,在脚本中发起后台命令,在nestedsubshell中发起后台命令)


来源: http://my.oschina.net/beiyou/blog/76226

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

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

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

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

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

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值