问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在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
安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 linux的副进程怎么标识 帮帮我,linux2.6以后怎么从struct sk 孤儿进程组已经不是当前会话的job了,为什么还要调用setsid Linux 简单的守护进程 程序源代码是什么怎么写? linux 怎样调用daemon库函数 关于linux守护进程的第二个fork()的作用的疑问 如何写一个Linux精灵进程 linux命令里面 nohup命令和 & 是不是一个意思啊,不挂断是什么意思。 linux 进程组,组长的一个疑问 linux setsid启动后怎么退出 Linux守护进程fork函数和setsid函数问题 新浪微博为什么会自己乱给我加关注? 为什么我的新浪微博总是有些乱七八糟的人关注? 为什么有时候页面会很乱 新浪微博成了这样子了 手机突然出现乱点现象,还有微博出现闪退现象 请问我这样是艾滋病吗? 请问我总这样是不是有心理疾病 请问我这种情况是不是社交恐惧症?具体如下 请问我这样是不是得了艾滋病? 请问我这样是不是要生了? 如何编写Linux Daemon后台程序 梦见过世的哥哥说话好吗? 梦见去世的哥哥站在棺材外面和我说话? 周公 解梦,梦见和死去的哥哥说话 梦见死去的老大哥大嫂还活着和我说话? 梦见我找死去的哥说话说他又活了什么意思? 携程金融骗局? 梦见死去的哥哥说话,和活着的叔叔,还有存折? 携程拿去花怎么提现?急 携程拿去花可以组合支付吗 超低温冰箱制冷剂怎么加,需要注意什么 类似快手的软件有哪些? 小米6x能装储存卡吗 可查看快手各项数据的软件有哪些? 像 快手那样的软件 还有哪些??? 小米6能插内存卡吗? 秋天做什么运动比较好? 秋天创业适合做什么生意 有哪些适合秋天做的户外运动? 秋天可以做哪些运动?