• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

在C和PHP环境中实现守护进程的实例

php 搞代码 3年前 (2022-01-22) 43次浏览 已收录 0个评论

一个守护进本2文来*源gao($daima.com搞@代@#码(网搞gaodaima代码程通常被认为是一个不对终端进行控制的后台任务。本文主要通过在在C环境和PHP环境下实现PHP守护进程的代码,介绍了PHP实现守护进程的方法以及原理过程。希望对大家理解PHP实现守护进程有所帮助。

什么是守护进程?

一个守护进程通常被认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork()

在glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon。PHP中暂时没有此函数,PHP程序实现守护进程化有2种方法:

1.使用系统命令nohup

nohup php myprog.php > log.txt 这样执行程序虽然也是转为后台运行,但实际上是依赖终端的,当用户退出终端时进程就会被杀掉。需要使用nohup来实现

2.使用supervisor工具 (推荐此方案)

详解supervisor使用教程

3.当然也可以用程序实现(不建议生产环境使用) C程序实现:

#include#include#include#include#include#include//实现守护进程步骤void crete_daemon(void){pid_t pid = 0;pid = fork();if (pid<0){perror("fork");exit(-1);}if (pid > 0){//1.父进程直接退出exit(0);}//2.//执行到这里就是子进程//setsid 将当前进程设置为一个新的会话期session,目的就是//让当前进程脱离控制台,成为守护进程。pid = setsid();if (pid < 0){perror("setsid");exit(-1);}//3.设置当前进程的工作目录为根目录,不依赖于其他chdir("/");//4.umask设置为0确保将来进程有最大的文件操作权限umask(0);//5.关闭文件描述符//先要获取当前系统中所允许打开的最大文件描述符数目int i = 0;int cnt = sysconf(_SC_OPEN_MAX);for (i=0;i

测试结果:

守护进程:

这里较为关键的二个php函数是pcntl_fork()和posix_setsid()

fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动他的进程与终端控制等,也意味着父进程可以自由退出。 setsid(),它首先使新进程成为一个新会话的“领导者”,最后使该进程不再控制终端,这也是成为守护进程最关键的一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端。(在直接打开一个终端设备,而且没有使用O_NOCTTY标志的情况下, 会获得控制终端)

其它事项说明:

chdir() 守护进程默认继承了父进程的当前工作目录,当系统磁盘发生umount时将造成诸多的麻烦,通常将”/” 作为守护进程的当前工作目录,可以避免上述的问题 umask() 守护进程默认继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性 fclose(STDIN), fclose(STDOUT), fclose(STDERR) 关闭标准I/O流。用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。

相关推荐:

用php写的进程守护,进程管理,进程出错自动启动功能,适合服务器管理员使用_PHP教程

windows下php-cgi进程守护

PHP将进程作为守护进程的方法,php进程守护进程

以上就是在C和PHP环境中实现守护进程的实例的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在C和PHP环境中实现守护进程的实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址