一种监控应用和拉起应用的方式

这段代码展示了如何通过创建管道(fifo)、fork进程、监控进程状态以及使用epoll来实现对Snmpd进程的监控和重启。主要函数包括test_SnmpClient_MsgProc,frame_Safe_System,test_add_snmpdpipe_fd_to_epoll和test_listen_snmpdpipe_peer_status。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VOS_VOID* test_SnmpClient_MsgProc(VOS_CHAR *argv [])
{
    const VOS_CHAR *fifo_name = "/xxx/snmpd.pipe";
    VOS_INT pipe_fd = -1;
    VOS_INT res = 0;
    int i = 0;
    int pid = 0;
    const VOS_INT open_mode = O_WRONLY;
    VOS_CHAR appimage[64]  = {0};
    VOS_CHAR acPara[SNMPDMAX_CMD_LEN]  = {0};
    pid_t fpid;
    int status = 0;
    int tyrnum = 0;

    kill_snmpd(); 
    fpid = fork();
    if (fpid == 0)
    {
        //child process
        (VOS_VOID)VOS_memset_s(argv[0], sizeof(argv[0]), 0, sizeof(argv[0]));
        //while(execvp(APP_SNMPD_STUB_NAME, argv) < 0 )
        (VOS_VOID)VOS_strcat_s(acPara, sizeof(acPara),APP_SNMPD_STUB_NAME);
        for(i = 0;i < g_uiargnum;i++)
        {
            if(i > 0)
            {
                (VOS_VOID)VOS_strcat_s(acPara, sizeof(acPara)," ");
                (VOS_VOID)VOS_strcat_s(acPara, sizeof(acPara),argv[i]);
            }
        }
        while(VOS_OK != frame_Safe_System(acPara))
        {
            tyrnum++;
            sleep(1);
            if(tyrnum >= 3)
            {
               exit(0);
            }
        }
    }
    if (fpid > 0)
    { 
        snmpd_parentpro_flag = VOS_TRUE;
        (void)waitpid(fpid, &status, pid);
        if(access(fifo_name, F_OK) == -1)
        {
            res = mkfifo(fifo_name, 0777);
            if(res != 0)
            {
                MODULELOG_LOGRD(LLOG_ERROR,"Could not create fifo %s\n", fifo_name);
                exit(EXIT_FAILURE);
            }
            (void)frame_Safe_System(SNMPDLAUNCH_CHANGE_FIFOPRI);
            (void)frame_Safe_System(SNMPDLAUNCH_CHANGE_FIFOOWN);
        }
        MODULELOG_LOGRD(LLOG_ERROR,"Snmpd Process %d opening FIFO O_WRONLY\n", getpid());
        pipe_fd = open(fifo_name, open_mode);        
        MODULELOG_LOGRD(LLOG_ERROR,"Process %d result %d\n", getpid(), pipe_fd);
        if(pipe_fd == -1)        
        {
            close(pipe_fd);
            exit(EXIT_FAILURE);
        }
        test_add_snmpdpipe_fd_to_epoll(pipe_fd);
        test_listen_snmpdpipe_peer_status(fpid,status); 
    }
    else
    {
        exit(0);
    }

    close(pipe_fd);
    exit(EXIT_SUCCESS);

}

 

VOS_INT32 frame_Safe_System(VOS_CHAR* pCmd)
{   
    VOS_INT32 iRet = 0;
    if (VOS_FALSE == frame_CheckCmdValid(pCmd))
    {
        return VOS_ERR;
    }

    iRet=system(pCmd);
    if ((-1 != iRet) && WIFEXITED(iRet) && (0 == WEXITSTATUS(iRet)))
    {    
        return VOS_OK;
    }
    else
    {
        return VOS_ERR;
    }  
}

 

 

VOS_INT test_add_snmpdpipe_fd_to_epoll(VOS_INT fd)
{
    VOS_INT ret = 0;
    struct epoll_event ev;  

    ev.data.fd = fd;
    ev.events = EPOLLIN | EPOLLET | EPOLLHUP | EPOLLERR;

    epfd = epoll_create(SNMPDEVMAX);
    ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev);
    if (ret != 0)
    {
        close(epfd);
        return (-1);
    }

}

VOS_INT test_listen_snmpdpipe_peer_status(pid_t childpid, VOS_INT status)
{
    VOS_INT ret = 0;
    VOS_INT i = 0;
    VOS_INT count = 0;

    while (1)
    {
        count = epoll_wait(epfd,events, SNMPDEVMAX, 1000);
        for (i = 0; i < count; i++)
        {
            if (events[i].events & EPOLLIN)
            {
                MODULELOG_LOGRD(LLOG_ERROR, "\n##   event=EPOLLIN\n");
            }

            if (events[i].events & EPOLLET)
            {
                MODULELOG_LOGRD(LLOG_ERROR,"\n##   event=EPOLLET\n");
            }

            if (events[i].events & EPOLLHUP)
            {
                MODULELOG_LOGRD(LLOG_ERROR,"\n##  event=EPOLLHUP\n");
                exit(0);
            }

            if (events[i].events & EPOLLERR)
            {
                MODULELOG_LOGRD(LLOG_ERROR,"the snmpd will be reboot!");
                MODULELOG_LOGRD(LLOG_ERROR,"\n##  event=EPOLLERR\n");
                exit(0);
            }
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值