文章目录
#include "_public.h"
#define MAXNUMP_ 1000
#define SHMKEYP_ 0x5059
struct st_pinfo
{
int pid;
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;
int m_shmid;
int m_pos;
struct st_pinfo* m_shm;
};
PActive::PActive()
{
m_shmid = -1;
m_pos = -1;
m_shm = NULL;
}
PActive::~PActive()
{
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) failed\n",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;
}