`

linux C++守护进程保障启动其它程序

 
阅读更多

转自:https://download.csdn.net/download/u013033015/10244526

#include <string.h>
#include<unistd.h>
#include<signal.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<fcntl.h>
#include<string.h>
#include<termios.h>
#include <syslog.h>
#include <dirent.h>
#include <ctype.h>

#define SNAME "sdemo" //守护线程名称
#define NAME  "test" //需要启动检测的程序
#define RNAME "/root/bin/test &" //程序目录和资源

//判断进程是否存在 预先判断守护进程是否存在,若已存在,不生成守护进程,若不存在,生成守护进程,在判断程序是否运行
int judge_pid_exist(int flag,char* pidName) //判断进程是否运行
{
    DIR *dir; //进程目录
    struct dirent * next; 
    int flags = 0; 
    int flagss = 0;

    FILE *status;
    char buffer[1024];
    char name[1024];

    dir = opendir("/proc"); ///proc中包括当前的进程信息,读取该目录
    if (!dir) //目录不存在结束
    {
        printf("Cannot open /proc\n");
        return 0;
    }

    //遍历 读取进程信息
    while ((next = readdir(dir)) != NULL) 
    {
        //跳过"."和".."两个文件名
        if ((strcmp(next->d_name, "..") == 0) || (strcmp(next->d_name, ".") == 0)) continue;

        //如果文件名不是数字则跳过
        if (!isdigit(*next->d_name)) continue;

        //判断是否能打开状态文件
        sprintf(buffer,"/proc/%s/status",next->d_name);
        if (!(status = fopen(buffer,"r"))) continue;

        //读取状态文件
        if (fgets(buffer,1024,status) == NULL)
        {
            fclose(status);
            continue;
        }
        fclose(status);

        sscanf(buffer,"%*s %s",name); //读取PID对应的程序名,格式为Name:  程序名

//        if (strcmp(name,pidName) == 0) //判断程序名是否符合预期
        if(strstr(name,pidName))  
        {
            if(flag == 1)
            {
                flagss = 1;
//             printf("%s\n",name);
                closedir(dir); //符合
                return 1;
            }
            else if(flag == 0)
            {
                flagss = 2;
                flags++;
            }
        }
    }
    closedir(dir);
    if(flagss == 1) return 0;
    else if(flagss == 2)
    {
        if(flags > 1) return 0;
        return 1;
    }
}

void init_daemon(void)  //守护进程初始化函数
{
    int pid = 0;
    int i = 0;
    if(pid=fork()) exit(0);//是父进程,结束父进程
    else if(pid< 0) exit(1);//fork失败,退出
    setsid(); //第一子进程成为新的会话组长和进程组长,并与控制终端分离
    for(i = 0;i < NOFILE;i++) close(i);//关闭打开的文件描述符
    chdir(".");//改变工作目录到/tmp
    umask(0);//重设文件创建掩模
    while(1) //判断程序是否运行
    {
        if(!judge_pid_exist(1,NAME)) system(RNAME);//father
        sleep(1);
    }
}

int main(void)
{
    if(judge_pid_exist(0,SNAME)) init_daemon(); //判断守护进程是否已运行
}

 

分享到:
评论

相关推荐

    linux c++ 守护线程,判断程序是否运行,不存在就启动

    在Linux系统中,C++编程时常常需要创建守护线程(daemon ...此外,如果目标程序是守护进程,可能需要考虑进程间的通信和控制,比如使用信号量或共享内存。在使用`system()`时,注意潜在的安全风险,避免命令注入。

    守护进程,背靠背c++实现

    守护进程在Unix/Linux系统中是非常常见的一种进程类型。它们通过脱离控制终端(detaching from the controlling terminal)和会话(session)来实现后台运行。首先,守护进程会关闭所有标准输入、输出和错误流,避免...

    c++ linux 守护进程

    在Linux系统中,守护进程...总之,C++在Linux环境下创建守护进程是一项关键技能,它能让你的程序在后台持续运行,提供服务或执行后台任务。理解并掌握守护进程的原理和创建方法对于任何系统级编程都是至关重要的。

    进程守护程序

    1. **启动与管理**:守护进程通常在系统启动时自动运行,并且可以在需要时被手动启动或停止。它们独立于终端会话,不受用户登录和注销的影响。在Linux系统中,可以使用`init`、`systemd`或`supervisord`等工具来管理...

    linux进程监控和进程守护程序

    监控进程,若程序岀或崩溃,重新启动程序4.收到退 出信号,安全结束监控程序 成功返回1,失败返回0 零牢容容家容字家容容察*禁容容字哮零常字容容容家察容牢容零容容容容容牢字家客字容牢容零容*字容客字容容字容家容容...

    linux进程守护相关

    重要的守护进程,其中“crond、syslog、keytable、xinetd、kudzu、iptables”等是需要运行的,echo、echo-udp、daytime、daytime-udp、chargen、chargen-udp主要是做调试用,普通用户基本用不到,可以关闭。

    守护进程(互相监听)

    在IT领域,守护进程(Daemon)是一种在后台运行的特殊类型的服务程序,它们不与任何终端关联,通常在操作系统启动时启动,持续运行直到系统关闭。守护进程在各种服务、监控任务以及系统管理中扮演着重要角色。在...

    MFC 守护进程

    在Windows系统中,我们可以通过MFC(Microsoft Foundation Classes)库来创建守护进程,以实现类似Unix/Linux环境下的守护进程功能。 MFC是微软提供的一套C++类库,用于简化Windows应用程序的开发。利用MFC,开发者...

    我自己写的守护进程-源码

    守护进程(Daemon)是计算机操作系统中的一...通过对源代码的深入分析和学习,我们可以了解如何在Windows环境下用C++实现一个类似守护进程的后台服务程序,同时也可以提升对C++编程、Windows API应用和进程管理的理解。

    服务级进程守护 C++ 有后台管理,方便控制多进程管理自启动

    3. **进程自启动**:在系统启动时,守护进程需要能够自动启动。这可以通过在系统启动脚本中加入启动命令,或者注册为系统服务来实现。在Linux系统中,可以使用`systemd`或`init.d`脚本来注册服务;在Windows中,可以...

    王健伟老师_Linux C++网络编程_工程思维导图.pdf

    守护进程的创建对于服务程序的稳定运行非常关键,可以防止服务进程意外退出导致服务不可用。 10. 网络编程中的事件驱动模型: 事件驱动模型在现代网络编程中应用广泛,它以事件的发生来触发处理函数的执行,提高了...

    socket linux c++ 多线程3

    在Linux中,守护进程常用于后台运行服务,它们通常没有控制终端,并且能在启动后独立运行。在编写多线程Socket服务器时,可能会将服务器进程转换为守护进程,以确保其在用户退出登录后仍能继续运行。 描述中提到的...

    VC6开发的进程守护程序

    8. **日志记录**:所有守护进程的操作,包括启动、停止、错误信息等,都应被记录在日志文件中,便于后期分析和调试。 9. **配置文件**:守护程序通常允许通过配置文件设定被监控服务的参数,以及自身的运行行为,...

    QT 监测其他进程运行状态,包括运行还是未启动;监测对象(这个进程)是有界面的,可以判断此界面是否为当前用户正在使用的界面

    QT 监测其他进程运行状态,包括运行还是未启动,或者是否置顶状态;监测对象(这个进程)是有界面的,可以判断此界面是否为当前用户正在使用的界面。用到CreateToolhelp32Snapshot;GetWindow;...

    守护进程_查看进程

    如果一个进程是守护进程,通常会在其命令行参数(CMD)中看到路径指向了/etc/init.d/或者/etc/systemd/下的脚本,这些都是启动守护进程的常见方式。 守护进程的管理和控制主要包括启动、停止、重启以及状态查询。在...

    C++编写LINUX守护进程的实现代码

    守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行; 守护进程一般都以root用户权限运行,因为要使用某些特殊的端口或者资源; 守护进程的父进程一般都是init进程,因为它真正的...

    Linux进程编程技术.doc

    Linux 进程编程技术 Linux 进程编程技术是指在 ...这些技术包括进程的基本概念、相关函数的应用、守护进程的概念、进程控制程序的编写、进程创建和管理、僵尸进程的避免、守护进程的实现、进程间通信和进程同步等。

    Linux系统状态检测及进程控制

    - **syslog**: 这是一个守护进程,用于接收并记录来自不同服务和程序的日志信息。它可以根据信息的重要程度将其定向到不同的日志文件中。 #### 五、进程控制 - **进程的基本概念**: 在Linux中,一切皆可视为进程。...

    守护进程(C语言写的360绝对杀不死)

    守护进程(Daemon)在计算机系统中扮演着至关重要的角色,它是后台运行的程序,通常不与用户交互,而是为其他服务或系统提供支持。在Linux和Unix-like操作系统中,守护进程广泛用于网络服务、系统管理任务以及持续...

    linux下自动连接wifi程序源码

    在实际应用中,这样的程序可能会被封装成服务或守护进程,以便在系统启动时自动运行,或在网络状态变化时自动响应。 10. **安全考虑**: 由于涉及网络连接,安全是必须考虑的因素。程序应保护好用户的WiFi密码,...

Global site tag (gtag.js) - Google Analytics