如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程_百 ...

发布网友 发布时间:2022-04-24 10:43

我来回答

2个回答

热心网友 时间:2022-04-26 05:09

可以分三步来做:

做两个简单的守护进程,并能正常运行
监控进程是否在运行
启动进程

综合起来就可以了,代码如下:
被监控进程thisisatest.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>


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   -- 查看日志

热心网友 时间:2022-04-26 06:27

守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的 文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守 护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端 (通常是shell)执行。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com