`

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++ 守护线程,判断程序是否运行,不存在就启动

    c++ linux 守护进程

    c++ linux 守护进程

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

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

    linux进程守护相关

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

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

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

    进程守护程序

    实施监督程序进程是否存在,如果不存在可自启程序

    TCPServer:监听 TCPIP 的 Linux 守护进程程序 (c,c++)

    侦听 TCP/IP 的 Linux 守护程序程序 (c,c++)。 TCP服务器: TCP 服务器应用程序构建在 Eclipse IDE、Ubuntu 14.04 LTS 上。 TCP 服务器:使用 Poco 库构建。 库依赖: ldd TCPSmartServer linux-vdso.so.1 =&gt;...

    看门狗 守护程序

    通用的看门狗程序,采用XML配置,可同时进行多个程序的守护。 (需安装.NET2.0)

    06--Linux系统编程-守护进程、线程.pdf

    linux开发

    Linux_FTP服务器实例

    ftp服务器的主要功能是上传下载文件以达到数据共享的目的。在linux底下开发ftp服务器旨在帮助学员综合...如:守护进程的编写,进程间通讯, 管道,socket编程,文件I/O标准库函数与系统调用,以及文件权限管理等等。

    按需优化Linux系统性能-C/C++开发

    该设计在主机守护程序和库之间具有明确的抽象(游戏模式为GameMode GameMode是Linux的守护程序/ lib组合,允许游戏请求将一组优化临时应用到主机OS和/或游戏进程。 GameMode最初被设计为解决Intel和AMD CPU节能或按...

    清华大学Linux操作系统原理与应用

    4.5.2 页面交换守护进程kswapd 99 4.6 内存管理实例 99 4.6.1 相关背景知识 100 4.6.2 代码体系结构介绍 100 4.6.3 实现步骤 103 4.6.4 程序代码 103 习题4 108 第5章 中断和异常 110 5.1 中断的基本知识 110 5.1.1 ...

    Naga_KeypadMapper:这个小小的 linux xorg 守护进程允许您通过 $HOME.naga 下名为 mapping.txt 的配置文件映射 Razer Naga 系列鼠标的侧键盘

    Naga_KeypadMapper 这个小小的 linux xorg 守护程序允许您通过$HOME/.naga/下名为mapping_xx.txt的配置文件映射 Razer Naga 系列鼠标的侧键盘,需要: xdotool和 X 服务器环境才能工作。 目前测试: CentOS 7 中的 ...

    RED HAT LINUX 6大全

    13.2 启动和停止NFS守护程序 236 13.3 NFS状态 236 13.4 配置NFS服务器和客户 236 13.4.1 建立/etc/exports文件 237 13.4.2 使用mount加载一个导出的文 件系统 238 13.4.3 卸载文件系统 238 13.4.4 配置/etc/fstab...

    Linux网络吞吐量多线程基准测试工具。-C/C++开发

    NTTTCP-for-Linux概述一个多线程...支持在后台运行(守护程序,“-D”)。 默认情况下支持发送方和接收方同步模式。 使用“ -N”(no_sync)禁用同步。 支持使用多个客户端模式进行测试(在Receiver上使用“ -M”,

    生产服务器部署规范.docx

    anacron 一个自动化运行任务守护进程 crond 计划任务守护进程 hald 设备的属性管理 dbus-daemon 是一个应用程序,它使用这个库来实现messagebus守护进程 Pcscd 用于监视进程活动的工具 portmap 主要功能是把RPC程序...

    ndk层实现双进程守护

    在linux 下,利用子进程发起建立Socket 连接,保持主进程达到90%保活率,包含完整C++代码和Java代码,注释详细,可直接用于项目开发

    Android应用保活(双进程守护,JobService,JobScheduler,WorkManage).zip

    Android应用保活(双进程守护,JobService,JobScheduler,WorkManager,监听系统广播等) 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与...

    Unix环境高级编程(APUE)——linux入门必学

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用...

    linux httpserver并发服务器案例,,可参考

    html服务器,使用了socket,多线程实现,,加入了守护进程,-b可进入.. 学习中使用的案例,可能还存在多种bug,仅供参考....代码头有本人联系方式

Global site tag (gtag.js) - Google Analytics