嵌入式Linux系统编程学习之十二守护进程


前言

  daemon 运行在后台,也称作“后台服务进程”,它是没有控制终端与之相连的进程,独立于控制终端,通常周期的执行某种任务。
  守护进程脱离终端是为了避免进程在执行过程中的信息在任何终端上显示,并且进程也不会被任何终端所产生的任何终端信息所打断。
  在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依赖这个终端,这个终端就称为这些进程的控制终端。当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它被执行开始运转,直到整个系统关闭时才退出。
  几乎所有的服务器程序,如 Apache 和 wu-FTP ,都用 daemon 进程的形式实现。很多 Linux 下常见的命令如 inetd 和 ftpd ,末尾的字母 d 通常就是指 daemon。


一、守护进程的特性

  • 守护进程最重要的特性是后台运行。
  • 守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录及文件创建掩码等。这些环境通常是守护进程从父进程那里继承下来的。
  • 守护进程的启动方式。

二、daemon 进程的编程规则

1.创建子进程,父进程退出

  调用 fork 产生一个子进程,同时父进程退出。我们所有后续工作都在子进程中完成,这样做可以交出控制台的控制权,并为子进程作为进程组长做准备;由于父进程已经先于子进程退出,会造成子进程没有父进程,变成一个孤儿进程。每当系统发现一个孤儿进程,就会自动由 1 号进程收养它,这样,原先的子进程就会变成 1 号进程的子进程。

2.在子进程中创建新会话

  使用系统函数 setsid() 。由于创建守护进程的第一步调用了 fork 函数来创建子进程,再将父进程退出。由于在调用 fork 函数时,子进程全盘复制了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端并没有变化,因此,还不是真正意义上的独立开来。而调用 setsid 函数会创建一个新的会话框并自任该会话的组长,调用 setsid 函数有下面三个作用:让进程摆脱原会话的控制;让进程摆脱原进程组的控制;让进程摆脱原控制终端的控制。

  进程组:是一个或多个进程的集合。进程组由进程组 ID 来唯一标识。除了进程号 (PID) 之外,进程组 ID (GID) 也是一个进程的必备属性。每个进程都有一个组长进程,其组长进程的进程号等于进程组 ID ,且该进程组 ID 不会因为组长进程的退出而受影响。
  会话期:会话期是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。
  控制终端:由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依赖这个控制终端。

  在子进程中创建新会话的步骤:

  • 改变当前目录为根目录;
  • 使用 fork 函数创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件是不能卸载的,这对以后的使用会造成很多的不便。利用 “chdir (”/");" 把当前工作目录切换到根目录;
  • 重设文件权限掩码;
  • “umask(0);” 将文件权限掩码设为 0 ,daemon 创建文件不会有太大麻烦;
  • 关闭所有不需要的文件描述符;
  • 新进程会从父进程那里继承一些已经打开了的文件,这些被打开的文件可能永远不会被守护进程读写,而它们一直消耗系统资源。另外守护进程已经与所属的终端失去联系,那么从终端输入的字符不可能到达守护进程,守护进程中常规方法(如 printf)输出的字符也不可能在终端上显示。所以通常关闭从 0 到 MAXFILE 的所有文件描述符。
	for(i=0;i<MAXFILE;i++)
		close(i);

  注意:有时还要处理 SIGCHLD 信号 signal(SIGCHLD,SIG_IGN); 防止僵尸进程。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值