Liunx配置 IP 地址和DNS服务器
2015-05-29 14:54
267 查看
用Linux守护进程检测某个程序是否运行2
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:Fedora12
目标板:SC6410
目标板LINUX内核版本:2.6.36
说明:
第一版程序(参考/article/1414676.html)已经可以正常工作,不过在运行一个月后发现有两台平板出现不能启动的问题,检查后发现是nand flash坏块很多,导致系统不能启动。究其原因,因该是对flash频繁的写操作造成的。上一版本的守护程序每分钟会写操作一次,这样一天的写操作就达千次。在这一版本中,判断需要守护的进程是否存在,是通过读取/proc/pid目录来判断的。参考链接:http://kb.cnblogs.com/a/2360817/
驱动源代码:
daemon_service.c:
[cpp] view plaincopy
//守护进程,守护AlarmInterface进程
//作者:jdh
//时间:2012-2-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 100
//#define DIR_OUT_FILE "/rf/out"
//#define NAME "gnome-keyring"
//#define NAME_FIND "gnome"
//#define DIR_OUT_FILE "/root/test/out"
int 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,不存在返回0
int judge_pid_exist(char* pidName)
{
DIR *dir;
struct dirent *next;
//long* pidList=NULL;
int i=0;
FILE *status;
char filename[READ_BUF_SIZE];
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)
{
/* Must skip ".." since that is outside /proc */
if (strcmp(next->d_name, "..") == 0)
{
continue;
}
/* If it isn't a number, we don't want it */
if (!isdigit(*next->d_name))
{
continue;
}
//设置进程
sprintf(filename, "/proc/%s/status", next->d_name);
if (! (status = fopen(filename, "r")) )
{
continue;
}
if (fgets(buffer, READ_BUF_SIZE-1, status) == NULL)
{
fclose(status);
continue;
}
fclose(status);
//得到进程id
/* Buffer should contain a string like "Name: binary_name" */
sscanf(buffer, "%*s %s", name);
if (strcmp(name, pidName) == 0)
{
//pidList=realloc( pidList, sizeof(long) * (i+2));
//pidList[i++]=strtol(next->d_name, NULL, 0);
//printf("hello,%s\n",next->d_name);
return 1;
}
}
//if (pidList)
//{
//pidList[i]=0;
//}
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;
}
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:Fedora12
目标板:SC6410
目标板LINUX内核版本:2.6.36
说明:
第一版程序(参考/article/1414676.html)已经可以正常工作,不过在运行一个月后发现有两台平板出现不能启动的问题,检查后发现是nand flash坏块很多,导致系统不能启动。究其原因,因该是对flash频繁的写操作造成的。上一版本的守护程序每分钟会写操作一次,这样一天的写操作就达千次。在这一版本中,判断需要守护的进程是否存在,是通过读取/proc/pid目录来判断的。参考链接:http://kb.cnblogs.com/a/2360817/
驱动源代码:
daemon_service.c:
[cpp] view plaincopy
//守护进程,守护AlarmInterface进程
//作者:jdh
//时间:2012-2-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 100
//#define DIR_OUT_FILE "/rf/out"
//#define NAME "gnome-keyring"
//#define NAME_FIND "gnome"
//#define DIR_OUT_FILE "/root/test/out"
int 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,不存在返回0
int judge_pid_exist(char* pidName)
{
DIR *dir;
struct dirent *next;
//long* pidList=NULL;
int i=0;
FILE *status;
char filename[READ_BUF_SIZE];
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)
{
/* Must skip ".." since that is outside /proc */
if (strcmp(next->d_name, "..") == 0)
{
continue;
}
/* If it isn't a number, we don't want it */
if (!isdigit(*next->d_name))
{
continue;
}
//设置进程
sprintf(filename, "/proc/%s/status", next->d_name);
if (! (status = fopen(filename, "r")) )
{
continue;
}
if (fgets(buffer, READ_BUF_SIZE-1, status) == NULL)
{
fclose(status);
continue;
}
fclose(status);
//得到进程id
/* Buffer should contain a string like "Name: binary_name" */
sscanf(buffer, "%*s %s", name);
if (strcmp(name, pidName) == 0)
{
//pidList=realloc( pidList, sizeof(long) * (i+2));
//pidList[i++]=strtol(next->d_name, NULL, 0);
//printf("hello,%s\n",next->d_name);
return 1;
}
}
//if (pidList)
//{
//pidList[i]=0;
//}
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;
}
相关文章推荐
- JavaScript-注释可用于提高代码的可读性
- 【超清】Autodesk Maya2013 安装过程
- JavaScript自学第2讲:JavaScript快速入门
- curl请求 和二进制图片处理
- iOS - TableViewCell分割线 --By吴帮雷
- 天呐,MIT的猎豹机器人可以在奔跑中跳跃过障碍
- 分批读取文件中数据的程序流程及其C代码实现
- js中代码分片执行
- 展讯7731平台驱动调试总结(3)---- 部分调试要点
- 解密随机数生成器
- 经典讲解C# get set
- 全国计算机软件水平考试各科目资格介绍
- Hadoop1.x代码求海量数据最大值
- 一个简单的Dump转文本工具—Dump2Text
- C++转Java自学之路(四)文档注释、静态代码块与对象初始化过程
- 07、Spring_web.xml_OpenSessionInViewFilter
- thinkphp Controller.class.php 控制器类的祖宗分析
- 南京学思利用Json进行数据传输
- Css3+javascript实现“唯美”照片墙
- uva 116 Unidirectional TSP