我是靠谱客的博主 安静小刺猬,最近开发中收集的这篇文章主要介绍Linux C 进程的心跳机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

将进程信息结构体存入共享内存,通过调查程序进行排查,当前时间减去进程存入的时间大于超时时间,表示这个进程已经死完了,需要重新启动

#include "_public.h"
#define MAXNUMP_    1000        // 最大的进程数量
#define SHMKEYP_    0x5059      // 共享内存的key

// 进程心跳信息的结构体
struct st_pinfo
{
    int     pid;                // 进程id
    char    pname[51];          // 进程名称,可以为空
    int     timeout;            // 超时时间,单位:秒
    time_t  atime;              // 最后一次心跳的时间,用整数 
};

class PActive
{
public:
    PActive();
    ~PActive();

public:
    bool AddPInfo(const int timeout,const char* pname);  // 把当前进程的心跳信息加入共享内存中
    bool UptATime();              // 更新共享内存中当前进程的心跳时间

private:
    CSEM    m_sem;                // 用于共享内存加锁的信号id
    int     m_shmid;              // 共享内存的id
    int     m_pos;                // 当前进程在共享内存进程组的位置
    struct st_pinfo* m_shm;       // 指向共享内存的地址空间
};

PActive::PActive()
{
    m_shmid = -1;
    m_pos = -1;
    m_shm = NULL;
}

PActive::~PActive()
{
    // 把当前进程从共享内存中移除
    //m_shm[m_pos].pid=0;
    if(m_pos!=-1)
        memset(m_shm+m_pos,0,sizeof(struct st_pinfo));

    // 把共享内存从当前进程中分离
    if(m_shm!=0)
        shmdt(m_shm);
}

bool PActive::AddPInfo(const int timeout,const char* pname)
{
    if(m_pos!=-1) return true;
    if((m_shmid=shmget(SHMKEYP_,MAXNUMP_*sizeof(struct st_pinfo),0640|IPC_CREAT))==-1)
    {
        printf("shmget(%x) failedn",SHMKEYP_);
        return false;
    }
    
    if((m_sem.init(SHMKEYP_))==false)
    {
        printf("m_sem.init(%x)",SHMKEYP_);
        return false;
    }
    // 将共享内存连接到当前进程的地址空间
    m_shm = (struct st_pinfo*)shmat(m_shmid,0,0);
    
    // 创建当前进程心跳信息结构体变量
    struct st_pinfo stpinfo;
    memset(&stpinfo,0,sizeof(struct st_pinfo));
    stpinfo.pid=getpid();
    STRNCPY(stpinfo.pname,sizeof(stpinfo.pname),pname,50);
    stpinfo.timeout=timeout;
    stpinfo.atime=time(0);

    // 如果共享内存中存在当前进程编号,就复用它(一定是其他进程残留下来的)
    for(int i=0;i<MAXNUMP_;i++)
    {
        if((m_shm+i)->pid == stpinfo.pid){m_pos=i;break;}
    }
    m_sem.P();          // 加锁
    
    // 共享内存创建不会有垃圾值
    // 在共享内存中查找一个空位置,把当前进程的心跳信息存入共享内存
    if(m_pos==-1)
    {
        for(int i=0;i<MAXNUMP_;i++)
        {
            if((m_shm+i)->pid==0)
            {
                m_pos=i;
                break;
            }
        }
    }
    if(m_pos==-1)
    {
        m_sem.V();
        printf("共享内存空间已用完n");
        return false;
    }

    // 找到空位子,将结构体位置内容拷贝进去
    memcpy(m_shm+m_pos,&stpinfo,sizeof(struct st_pinfo));
    m_sem.V();              // 解锁
    return true;
}

bool PActive::UptATime()
{
    if(m_pos!=-1) return false;
    m_shm[m_pos].atime = time(0);
    return true;
}

int main(int argc,char* argv[])
{
    if(argc<2) return -1;
    PActive Active;
    Active.AddPInfo(30,argv[1]);
    while(true)
    {
        Active.UptATime();
        sleep(10);
    }

	return 0;
}

最后

以上就是安静小刺猬为你收集整理的Linux C 进程的心跳机制的全部内容,希望文章能够帮你解决Linux C 进程的心跳机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部