最近公司的一个项目由于有个进程运行不稳定,会出现意外退出的情况,于是便做了这么个小玩意!
本人第一次写些东西,难免生疏! 以后 还请大家多帮助!
希望对有需要的朋友有点作用.
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#define TMP_FILE “/tmp/proc.log”
#define VALID_NAME “vtserver”
#define PROCBUF 30
#define COMMONLEN 256
#define FILEBUF 256
#define ONE_MICRO_SECOND (1000)
#define ONE_SECOND (1000 * ONE_MICRO_SECOND)
#define PROCINVALID -1
#define PROCEXIST 0
#define PROCNOEXIST 1
int checkbyname(const char* name); //Accoriding to the process of checking the existence of Name
void init_daemon(void);
void valid(char *str);
//做得很简单,没有进行参数,返回值检查,要监控的进程也写死了
int main()
{
char* name = NULL;
int result = 0;
name = VALID_NAME;
init_daemon(); //弄成守护进程
while(1)
{
usleep(1000 * ONE_MICRO_SECOND); //1000ms,休息1秒
result = checkbyname(name);
if (result == PROCNOEXIST) //该进程不存在
{
pid_tpid;
pid= fork();
switch(pid)
{
case 0:
if (-1 == execl(“/usr/local/DoubleS/bin/vtserver”,”vtserver”,0))
printf(“Failed!/n”);
break;
default:
{
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val); //父进程等待子进程结束
}break;
}
}else
{
}
}
exit(0);
}
int checkbyname(const char* name) //假设fopen 一定是可以的
{
int readsize = 0;
FILE* file = NULL;
char command[COMMONLEN] = {‘/0’};
char buf[FILEBUF] = {‘/0’};
if (!name || strlen(name) <= 0)
return PROCINVALID;
sprintf(command,”ps -Al | grep %s > /tmp/proc.log”,name);
system(command);
file = fopen(TMP_FILE,”r”); //其实这里可以利用管道实现,但我不知道哪个效率高些
if (file)
{
readsize = fread(buf,sizeof(buf),1,file);
fseek(file,0,SEEK_END);
readsize = ftell(file);
fclose(file);
}
if (readsize != 0)
return PROCEXIST;
else
return PROCNOEXIST;
}
void init_daemon(void)
{
pid_t pid;
int i = 0;
if (pid = fork()) //pid > 0 就为父进程
exit(0);
else if (pid < 0) //pid < 0 失败了
exit(1); //fork failed
setsid(); //脱离父进程的会话,自己(第一个子进程)成为会话组长
if (pid = fork())
exit(0); //第一个子进程退出
else if (pid < 0)
exit(1); //fork failed
//这里是第二个子进程,即为第一个子进程创建的子进程
//关闭标准输入,输出,错误输出文件描述符
close(0);
close(1);
close(2);
chdir(“/”); //更改目录
umask(0); //重新设置文件掩码,我这里放的很松! 什么权限都有, 本人,组,其他人 都有读写执行的权限
return;
}
人生重要的不是所站的位置,而是所朝的方向