概述
文章目录
将进程信息结构体存入共享内存,通过调查程序进行排查,当前时间减去进程存入的时间大于超时时间,表示这个进程已经死完了,需要重新启动
#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 进程的心跳机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复