让你真正理解守护进程

标题当你进来的时候,希望你没有在网上看过狠多别的介绍守护进程的文章,那么我恭喜你,不用浪费时间了。我就看了很多,结合了好多点,才真正理解守护进程的实现的核心点是什么。
反正我看过好几个,都差不多,但是总是有些点没有理解到,希望看我的你能够理解。

步骤:

1.父进程fork()出子进程。然后父进程退出exit()。

说明:由于创建守护进程的第一步调用了fork函数来创建子进程再将父进程退出。由于在调用fork函数时,子进程拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,这个子进程仍然父进程的属性,没脱离终端。因此,这还不是真正意义上的独立开了。

2.调用setsid;setsid()使子进程成为新的会话组长和进程组长。此时与原来的登陆会话和进程脱离。调用setsid有3个作用:(a) 让进程摆脱原会话的控制;(b) 让进程摆脱原进程组的控制;© 让进程摆脱原控制终端的控制; setsid()

使用setsid函数的目的:能够使进程完全独立出来,从而摆脱其他进程的控制。
说明:此时,该进程已经是脱离了终端的进程。不过需要注意的是,setsid使之成为了进程组组长,又让其有了重新获取终端的权利和机会;

3.再一次创建子进程;然后再将当前进程exit();

说明:测试二级子进程继续自一级子进程,由于子进程已经脱离了中断/会话,故,二级子进程也已经脱离了中断/会话;
再者,没有调用setsid,也就他不是进程leader,也就没有权利和机会重新获取终端,会话。

4.这样,当前二级子进程就是我们的最终要的守护进程了。即使我们注销了,程序依然进程下去。

示例代码:

<?php
$pid = pcntl_fork();
if ($pid == -1)
{
  throw new Exception('fork子进程失败');
}
elseif ($pid > 0)
{
  //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端
  exit(0);
}
//后边是子进程进行的部分
// 最重要的一步,让该进程脱离之前的会话,终端,进程组的控制
posix_setsid();
// 修改当前进程的工作目录,由于子进程会继承父进程的工作目录,修改工作目录以释放对父进程工作目录的占用。
chdir('/');
/*
* 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长。
*/
$pid = pcntl_fork();
if ($pid == -1)
{
  throw new Exception('fork子进程失败');
}
elseif ($pid > 0)
{
  // 再一次退出父进程,子进程成为最终的守护进程
  exit(0);
}
// 由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
/*
* 处理业务代码
*/
while(TRUE)
{
  file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);
  sleep(5);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值