获取了共享内存后,需不需要对共享内存进行初始化??

来源:2-13 -1 进程的心跳机制

慕先生9503595

2022-04-14

以下代码,按照老师讲课的代码编写,编译也通过了。运行时,一直提示共享内存已用完。用 ipcs -m 中可以看到分配一个 5095 的共享内存。获取了共享内存后,需不需要对共享内存进行初始化??

#include “_public.h”

#define MAXNUMP_ 1000 // 最大的进程数量
#define SHMKEYP_ 0X5095 // 共享内存的key

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

int main(int argc, char *argv[])
{
if (argc<2) {printf(“Using:./book procname\n”); return 0; }

// 创建/获取共享内存
int m_shmid=0;
if ( (m_shmid=shmget(SHMKEYP_,MAXNUMP_*sizeof(struct st_pinfo),0640|IPC_CREAT)) == -1 )
{ printf(“shmget(%s) failed.\n”,SHMKEYP_); return -1; }

// 将共享内存连接到当前进程的地址空间
struct st_pinfo *m_shm;
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),argv[1],50);
stpinfo.timeout=30; // 超时时间,单位:秒
stpinfo.atime=time(0); // 最后一次心跳时间,填当前时间

// 在共享内存中找一个空位置,把当前进程的心跳信息存入共享内存
int m_pos=-1;
for (int ii=0;ii<MAXNUMP_;ii++)
{
//if ( (m_shm+1)->pid0 )
if ( m_shm[ii].pid0 )
{
// 找到了一个空位置。
m_pos==ii; break;
}

}
printf(“m_pos=%d\n”,m_pos);

if (m_pos==-1) // 没有找到空位置打印信息并退出
{
printf(“共享内存空间已用完。\n”); return -1;
}

// 把当前进程的心跳信息存入共享内存的进程组中。
memcpy(m_shm+m_pos,&stpinfo,sizeof(struct st_pinfo));
printf(“break point.\n”); // 这一行设置断点

while (true)
{
sleep(10);
}

return 0;
}

写回答

1回答

长歌_吴从周

2022-04-14

如果遇到了问题,你直接用我的代码测试,这是项目实战,写的代码很长,查bug不是一件容易的事情。

如果我的代码没有问题,那问题就在你自己了,把你的代码和我的代码对比一下就行了。

0
2
长歌_吴从周
回复
慕先生9503595
我忘了linux会不会把共享内存初始化为0这个细节。 但是,这个问题很容易证明。 我认为你在学习方法上要改善。 linux会不会把共享内存初始化为0,自己写一段代码测试一下不就知道了。 如果没有初始化为0,加一行代码memset初始化为0不就行了。 这不应该成为一个问题。 还有man可以用,百度也可以用,也许自己验证比提问更省时间。 没必要什么都问,要学会自己解决问题,程序员必须解决问题的能力。 在以后的学习和工作中,遇到的问题会更多。
2022-04-14
共2条回复

C/C++气象数据中心实战,手把手教你做工业级项目

通过技术的实际应用,掌握等同2年经验的技术能力

968 学习 · 401 问题

查看课程