1. 程式人生 > >C程序fork進程導致PHP執行不退出

C程序fork進程導致PHP執行不退出

printf alfred 文件描述 pre 處理 demo 文件描述符 time_t 狀態

/*********************************************************************
 *                C程序fork進程導致PHP執行不退出
 * 說明:
 *     由於測試的GPIO程序需要持續運行,而主進程需要處理其他事務但退出時
 * 由於子線程未結束導致PHP系統調用函數不退出,解決辦法是雙重fork(第一次
 * fork產生子進程用於kill掉讓第二次fork出的子進程變成孤兒進程),並將最終
 * 的子進程轉換為守護進程,從而不影響PHP獲取主進程數據。
 *
 *                                   2017-8-16 深圳 龍華樟坑村 曾劍鋒
 *******************************************************************
*/ 一、參考文檔: 1. 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 = 0; if ((pid = fork()) == -1) { printf("Fork error !\n"); exit(1); } if (pid != 0
) { exit(0); // 父進程退出 } setsid(); // 子進程開啟新會話,並成為會話首進程和組長進程 if ((pid = fork()) == -1) { printf("Fork error !\n"); exit(-1); } if (pid != 0) { exit(0); // 結束第一子進程,第二子進程不再是會話首進程 } chdir("/tmp"); // 改變工作目錄 umask(0); // 重設文件掩碼 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 = 0; //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 (1) { if (-1 == (fp = open("/tmp/daemon.log", O_CREAT|O_WRONLY|O_APPEND, 0600))) { printf("Open file error !\n"); exit(1); } len = strlen(buf); write(fp, buf, len); t = time(0); datetime = asctime(localtime(&t)); len = strlen(datetime); write(fp, datetime, len); close(fp); sleep(60); } return 0; }

C程序fork進程導致PHP執行不退出