守护进程监测并启动程序
通过进程的名称监控某个进程,如果该进程退出了,就马上启动该进程。通过system启动,如果该进程不退出或崩溃,将阻塞等待,将不会通过命令检查该进程是否存活。
源代码:deamon.c
#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> int Init_daemon(void) { pid_t pid; int i; pid = fork(); //结束父进程,使得子进程成为后台,子进程会成为孤儿进程,最终被init进程 if (pid > 0) //父进程将得到子进程pid 一般得到的pid值大于0,子进程得到的pid值=0 { exit(0); } else if (pid < 0) { return -1; } /*建立一个新的进程组,,子进程成为这个进程组的首进程,以使该进程脱离所用终端*/ setsid(); /*再次新建一个子进程,退出父进程,保证该进程不是进程组长,同时让该进程无法再打开一个新的终端*/ pid = fork(); if (pid > 0) { exit(0); } else if (pid < 0) { return -1; } //关闭所用从父进程继承的不再需要的文件描述符 for (i = 0; i < NOFILE; close(i++)) ; //改变工作目录,使得进程不与任何文件系统联系 chdir("/"); //第五步:将文件屏蔽字设置为0 umask(0); //第六步:忽略SIGCHLD信号 signal(SIGCHLD, SIG_IGN); return 0; } void *MonitorProc(void *arg) { FILE *fp = NULL; FILE *pLogFile = NULL; // 文件指针 char buf[1024]; char spbuf[128]; int nums = -1; static int countNum = 0; while (1) { memset(buf, 0, sizeof(buf)); memset(spbuf, 0, sizeof(spbuf)); nums = -1; fp = NULL; fp = popen("ps -ef | grep autoTest.out | grep -v grep | wc -l", "r"); if (!fp) { continue; } else { while (fgets(buf, sizeof(buf) - 1, fp) != 0) { nums = atoi(buf); //if (nums <=0) { time_t now; //实例化time_t结构 struct tm *timenow; //实例化tm结构指针 time(&now); //time函数读取现在的时间(国际标准时间非北京时间),然后传值给now timenow = localtime(&now); //localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区) snprintf(spbuf, sizeof(spbuf),"AutoRunCount:countNum=%d Local time:%s",++countNum,asctime(timenow)); // 以附加方式打开可读/写的文件, 如果没有此文件则会进行创建,然后以附加方式打开可读/写的文件 pLogFile=fopen("./deamon.log", "a+"); if(pLogFile!=NULL) { fputs(spbuf,pLogFile); fclose(pLogFile); } system("./autoTest.out >/dev/null "); } } pclose(fp); } } } void RunMonitorProc() { pthread_t monitor_t; pthread_create(&monitor_t, NULL, MonitorProc, NULL); } int main(int argc, char *argv[]) { Init_daemon(); //初始化Daemon RunMonitorProc(); while (1) { sleep(10); } return 0; }
也可以简单粗暴实现:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { while(1) { system("./autoTest.out >/dev/null "); } return 0; }
测试启动程序autoTest.c
#include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { sleep(3); return 0; }
分类:
应用实例Sample
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App