博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
守护进程详解
阅读量:6103 次
发布时间:2019-06-20

本文共 2262 字,大约阅读时间需要 7 分钟。

1. 守护进程是什么?

  守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。守护进程脱离终端的主要原因有两点:  

  (1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。  

2. 守护进程的创建

  1. 调用umask将文件模式创建屏蔽字设置为0.
  2. 调用fork,父进程退出(exit )
      原因:1)如果该守护进程是作为一条简单的shell命令启动的,那么⽗父进程终⽌止使得shell认为该命令已经执行完毕。
         2)保证子进程不是一个进程组的组长进程。
  3. 调⽤用setsid创建⼀一个新会话。setsid会导致:

         1)调用进程成为新会话的首进程。
         2)调用进程成为一个进程组的组长进程 。
         3)调用进程没有控制终端。(再次fork一次,保证daemon进程,之后不会打开tty设备)

  4. 将当前工作⽬目录更改为根目录。

  5. 关闭不在需要的文件描述符。
  6. 其他:忽略SIGCHLD信号。
/*************************************************************************    > File Name: deamon.c    > Author: sunxingying    > Mail: 1159015605@qq.com     > Created Time: 2017年06月07日 星期三 01时07分54秒 ************************************************************************/#include
#include
#include
#include
#include
void create_deamon(void){ pid_t pid; /* * 成为一个新会话的首进程,失去控制终端 */ if(pid=fork()<0) {
perror("fork failed!!"); exit(0); } else if(pid!=0) {
exit(0); } if(setsid()<0) {
perror("setsid failed!!"); exit(0); } umask(0); /* * 改变当前工作目录到/目录下. */ if (chdir("/") < 0) {
perror("chdir"); exit(1); } /* * 重定向0,1,2文件描述符到 /dev/null,因为已经失去控制终端,再操作0,1,2没有意义. */ close(0); open("/dev/null",O_RDWR); dup2(0,1); dup2(0,2);}int main(void){ create_deamon(); while(1);}

3. 为什么有人fork2次

  1. 第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。

  2. setsid() 是本函数最重要的一个调用。它完成了daemon函数想要做的大部分事情。调用完整个函数。子进程是会话组长(sid==pid),也是进程组组长(pgid == pid),并且脱离了原来控制终端。到了这一步,基本上不管控制终端如何怎么样。新的进程都不会收到那些信号。

  3. 经过前面2个步骤,基本想要做的都做了。第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前提条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。

      daemon目的就是防止终端产生的一些信号让进程退出。上面函数并没有直接调用signal函数去处理它。而是间接通过fork和setsid函数使用更少代码优雅处理。而被有些人误以为是僵死进程的原因需要这样处理。

      

4. 守护进程与用&结尾的后台运行程序有什么区别呢?

最大的区别有几点:

  1. 守护进程已经完全脱离终端控制台了,而后台程序并未完全脱离终端,在终端未关闭前还是会往终端输出结果
  2. 守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohug xxx & 格式运行才能避免影响
  3. 守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。

转载于:https://www.cnblogs.com/readlearn/p/10806470.html

你可能感兴趣的文章
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
直播视频流技术名词
查看>>
iOS13-适配夜间模式/深色外观(Dark Mode)
查看>>
网易跟贴这么火,背后的某个力量不可忽视
查看>>
企业级java springboot b2bc商城系统开源源码二次开发-hystrix参数详解(八)
查看>>
java B2B2C 多租户电子商城系统- 整合企业架构的技术点
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
mysql的innodb中事务日志(redo log)ib_logfile
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
linux系统安装的引导镜像制作流程分享
查看>>