用Linux守护进程检测某个程序是否运行2

来源:互联网 发布:关于java编程的书 编辑:程序博客网 时间:2024/05/21 15:00

用Linux守护进程检测某个程序是否运行2


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:Fedora12

目标板:SC6410

目标板LINUX内核版本:2.6.36


说明:

第一版程序(参考http://blog.csdn.net/jdh99/article/details/7300641)已经可以正常工作,不过在运行一个月后发现有两台平板出现不能启动的问题,检查后发现是nand flash坏块很多,导致系统不能启动。究其原因,因该是对flash频繁的写操作造成的。上一版本的守护程序每分钟会写操作一次,这样一天的写操作就达千次。在这一版本中,判断需要守护的进程是否存在,是通过读取/proc/pid目录来判断的。参考链接:http://kb.cnblogs.com/a/2360817/


驱动源代码:

daemon_service.c:

//守护进程,守护AlarmInterface进程//作者:jdh//时间:2012-4-27#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <syslog.h>#include <dirent.h>//程序名字#define NAME "AlarmInterface"//要运行的程序#define RUN_NAME "DuiJiang &"#define READ_BUF_SIZE 1024int daemon(int nochdir,int noclose){pid_t pid;//让init进程成为新产生进程的父进程pid = fork();//如果创建进程失败if (pid < 0){perror("fork");return -1;}//父进程退出运行if (pid != 0){exit(0);}//创建新的会话pid = setsid();if (pid < -1){perror("set sid");return -1;}//更改当前工作目录,将工作目录修改成根目录if (!nochdir){chdir("/");}//关闭文件描述符,并重定向标准输入,输出合错误输出//将标准输入输出重定向到空设备if (!noclose){int fd;fd = open("/dev/null",O_RDWR,0);if (fd != -1){dup2(fd,STDIN_FILENO);dup2(fd,STDOUT_FILENO);dup2(fd,STDERR_FILENO);if (fd > 2){close(fd);}}}//设置守护进程的文件权限创建掩码umask(0027);return 0;}//存在返回1,不存在返回0int judge_pid_exist(char* pidName){DIR *dir;struct dirent *next;int i = 0;FILE *status;char buffer[READ_BUF_SIZE];char name[READ_BUF_SIZE]; ///proc中包括当前的进程信息,读取该目录dir = opendir("/proc");if (!dir){printf("Cannot open /proc\n");return 0;}     //遍历while ((next = readdir(dir)) != NULL) {//跳过"."和".."两个文件名if ((strcmp(next->d_name, "..") == 0) || (strcmp(next->d_name, ".") == 0)){continue;}//如果文件名不是数字则跳过if (!isdigit(*next->d_name)){continue;}//判断是否能打开状态文件sprintf(buffer,"/proc/%s/status",next->d_name);if (!(status = fopen(buffer,"r"))) {continue;}//读取状态文件if (fgets(buffer,READ_BUF_SIZE,status) == NULL) {fclose(status);continue;}fclose(status);//读取PID对应的程序名,格式为Name:程序名sscanf(buffer,"%*s %s",name);//判断程序名是否符合预期if (strcmp(name,pidName) == 0) {//符合closedir(dir);return 1;}    } closedir(dir);return 0;}int main(int argc,char *argv[]){int fd = 0;char buf[100];//开启守护进程daemon(0,0);while (1){//打开日志openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER);//判断是否有程序文件运行if (judge_pid_exist(NAME)){syslog(LOG_INFO,"jdh success:)!!!!!!!!!!");//printf("hello,jdh,exist\n");}else{syslog(LOG_INFO,"jdh fail:(!!!!!!!!!!");//运行程序system(RUN_NAME);//printf("hello,jdh,oh,no\n");}//休眠sleep(60);}//关闭日志closelog();return 0;}

原创粉丝点击