写一个linux下写个关于c语言的双守护进程,就是监视一个进程,当其死掉,马上将其重启

 我来答
sdwffzlll
推荐于2017-11-22 · TA获得超过758个赞
知道小有建树答主
回答量:498
采纳率:85%
帮助的人:243万
展开全部

可以分三步来做:

  1. 做两个简单的守护进程,并能正常运行

  2. 监控进程是否在运行

  3. 启动进程

综合起来就可以了,代码如下:

被监控进程thisisatest.c(来自http://www.cnblogs.com/ringwang/p/3528093.html):

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<time.h>


void init_daemon()

{

int pid;

int i;

pid=fork();

if(pid<0)    

    exit(1);  //创建错误,退出

else if(pid>0) //父进程退出

    exit(0);

    

setsid(); //使子进程成为组长

pid=fork();

if(pid>0)

    exit(0); //再次退出,使进程不是组长,这样进程就不会打开控制终端

else if(pid<0)    

    exit(1);


//关闭进程打开的文件句柄

for(i=0;i<NOFILE;i++)

    close(i);

chdir("/root/test");  //改变目录

umask(0);//重设文件创建的掩码

return;

}


void main()

{

    FILE *fp;

    time_t t;

    init_daemon();

    while(1)

    {

        sleep(60); //等待一分钟再写入

        fp=fopen("testfork2.log","a");

        if(fp>=0)

        {

            time(&t);

            fprintf(fp,"current time is:%s\n",asctime(localtime(&t)));  //转换为本地时间输出

            fclose(fp);

        }

    }

    return;

}


监控进程monitor.c:

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<time.h>


#include<sys/wait.h>

#include<fcntl.h>

#include<limits.h>


#define BUFSZ 150


void init_daemon()

{

int pid;

int i;

pid=fork();

if(pid<0)

    exit(1);  //创建错误,退出

else if(pid>0) //父进程退出

    exit(0);


setsid(); //使子进程成为组长

pid=fork();

if(pid>0)

    exit(0); //再次退出,使进程不是组长,这样进程就不会打开控制终端

else if(pid<0)

    exit(1);


//关闭进程打开的文件句柄

for(i=0;i<NOFILE;i++)

    close(i);

chdir("/root/test");  //改变目录

umask(0);//重设文件创建的掩码

return;

}


void err_quit(char *msg)

{

perror(msg);

exit(EXIT_FAILURE);

}


// 判断程序是否在运行

int does_service_work()

{

FILE* fp;

int count;

char buf[BUFSZ];

char command[150];

sprintf(command, "ps -ef | grep thisisatest | grep -v grep | wc -l" );


if((fp = popen(command,"r")) == NULL)

err_quit("popen");


if( (fgets(buf,BUFSZ,fp))!= NULL )

{

count = atoi(buf);

}

pclose(fp);

    return count;

// exit(EXIT_SUCCESS);

}



void main()

{

    FILE *fp;

    time_t t;

    int count;

    init_daemon();

    while(1)

    {

        sleep(10); //等待一分钟再写入

        fp=fopen("testfork3.log","a");

        if(fp>=0)

        {

            count = does_service_work();

            time(&t);

            if(count>0)

                fprintf(fp,"current time is:%s and the process exists, the count is %d\n",asctime(localtime(&t)), count);  //转换为本地时间输出

            else

            {

                fprintf(fp,"current time is:%s and the process does not exist, restart it!\n",asctime(localtime(&t)));  //转换为本地时间输出

                system("/home/user/daemon/thisisatest"); //启动服务

            }


            fclose(fp);

        }

    }

    return;

}


具体CMD命令:


cc thisisatest.c -o thisisatest

./thisisatest

cc monitor.c -o monitor

./monitor


tail -f testfork3.log   -- 查看日志

兄弟连教育
2016-07-01 · 百度知道合伙人官方认证企业
兄弟连教育
兄弟连教育成立于2006年,11年来专注IT职业教育,是国内专业的IT技术培训学校。2016年成功挂牌新三板(股票代码:839467)市值过亿。开设专注程序员培训专注php、Java、UI、云计算、Python、HTML5、
向TA提问
展开全部
这跟execvp函数的实现方式有关:
int execvp(const char *file ,char * const argv []);

execvp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

之所以显示“fail to exec”,是因为在PATH环境变量所指的目录中没有名为“hello”的程序。建议进行如下操作:
1、运行“echo $PATH”,查看一下PATH环境变量指向那些目录
2、编写一个输出“hello world”的程序,并命名为hello,即执行命令:
gcc -o hello hello.c
3、把名为”hello“的程序拷贝到PATH变量所指的其中一个目录中
追问
可不可以写具体一点代码
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式