/*********************************************************************
* C程序fork进程导致PHP执行不退出
* 说明:
* 由于测试的GPIO程序需要持续运行,而主进程需要处理其他事务但退出时
* 由于子线程未结束导致PHP系统调用函数不退出,解决办法是双重fork(第一次
* fork产生子进程用于kill掉让第二次fork出的子进程变成孤儿进程),并将最终
* 的子进程转换为守护进程,从而不影响PHP获取主进程数据。
*
* 2017-8-16 深圳 龙华樟坑村 曾剑锋
********************************************************************/ 一、参考文档:
. Linux 守护进程的实现
http://alfred-sun.github.io/blog/2015/06/18/daemon-implementation/ 二、测试daemon Demo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> // 守护进程初始化函数
void init_daemon()
{
pid_t pid;
int i = ; if ((pid = fork()) == -) {
printf("Fork error !\n");
exit();
}
if (pid != ) {
exit(); // 父进程退出
} setsid(); // 子进程开启新会话,并成为会话首进程和组长进程
if ((pid = fork()) == -) {
printf("Fork error !\n");
exit(-);
}
if (pid != ) {
exit(); // 结束第一子进程,第二子进程不再是会话首进程
}
chdir("/tmp"); // 改变工作目录
umask(); // 重设文件掩码
for (; i < getdtablesize(); ++i) {
close(i); // 关闭打开的文件描述符
} return;
} int main(int argc, char *argv[])
{
int fp;
time_t t;
char buf[] = {"This is a daemon: "};
char *datetime;
int len = ;
//printf("The NOFILE is: %d\n", NOFILE);
//printf("The tablesize is: %d\n", getdtablesize());
//printf("The pid is: %d\n", getpid()); // 初始化 Daemon 进程
init_daemon(); // 每隔一分钟记录运行状态
while () {
if (- == (fp = open("/tmp/daemon.log", O_CREAT|O_WRONLY|O_APPEND, ))) {
printf("Open file error !\n");
exit();
}
len = strlen(buf);
write(fp, buf, len);
t = time();
datetime = asctime(localtime(&t));
len = strlen(datetime);
write(fp, datetime, len);
close(fp);
sleep();
} return ;
}

C程序fork进程导致PHP执行不退出的更多相关文章

  1. Linux从程序到进程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在高级语言中,这些内存管理的细节对于用户来说不透明.在编程的时候,我们只需要记住上 ...

  2. Linux0.11内核--fork进程分析

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5597818.html ] 据说安卓应用里通过fork子进程的方式可以防止应用被杀,大概原理就是 ...

  3. java16 程序、进程、线程

    一.程序.进程.线程 .程序:程序就是我们编写的代码,也就是指令集,是一个静态概念. .进程:操作系统调度我们的程序,动态概念,一个程序就是一个进程.进程是程序的一次动态执行过程,占用特定的地址空间, ...

  4. Android Init进程命令的执行和服务的启动

    这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...

  5. 通过fork进程爆破canary

    1.1.1    通过fork进程爆破canary ⑴.原理分析: 对fork而言,作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然canary值也一样.那我们就可以逐位爆破,如果程 ...

  6. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  7. 性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?

    性能分析小案例系列,可以通过下面链接查看哦 ps:这些分析小案例不能保证百分比正确,是博主学习过程中的总结,仅做参考 前提 本机有一个很占用 CPU 的项目,放在了 Tomcat 下启动着 如何定位 ...

  8. remove name="ProxyModule“会导致重复执行

    <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访 ...

  9. 关于Java中的程序,进程和线程的详解...

    程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本. 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个 ...

随机推荐

  1. Commons之Commons-io

    转载自(https://my.oschina.net/u/2000201/blog/480071) 1  概述 Commons IO是针对开发IO流功能的工具类库. 主要包括六个区域: 工具类——使用 ...

  2. python下载网页上公开数据集

    URL很简单,数据集分散开在一个URL页面上,单个用手下载很慢,这样可以用python辅助下载: 问题:很多国外的数据集,收到网络波动的影响很大,最好可以添加一个如果失败就继续请求的逻辑,这里还没有实 ...

  3. LeetCode——maximal-rectangle

    Question Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ...

  4. 【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

    初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构 ...

  5. springMVC注解的入门案例

    1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...

  6. C4 文件和目录:APUE 笔记

    C4: 文件和目录 本章主要讨论stat函数及其返回信息,通过修改stat结构字段,了解文件属性. struct stat结构定义如下: struct stat { __dev_t st_dev; / ...

  7. 【Python】深入浅出学习Python的yield和generator

    背景 之前走马观花接触过Python协程的概念,这两天和一个同事聊到了协程,死活想不起来曾经看过的东西,就记得一个yield,概念不清: 所以想捋一捋相关的东西,此篇作为学习的记录. Generato ...

  8. easyui datagrid 没有记录

    datagrid返回记录为0时显示"没有记录" datagrid 插件编写 <script> var emptyview = $.extend({},$.fn.data ...

  9. JSON 参考文档

    1.JSON字符串转换为JSON对象 var obj = JSON.parse(str); 2.JSON对象转化为JSON字符串 var str = JSON.stringify(obj); 对此有一 ...

  10. Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

    1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...