我正在使用共享内存段并遇到了这个奇怪的问题。
我正在尝试在许多进程之间共享一个结构:
struct shmstruct{
int pid[50];
char user[50][10];
};
struct shmstruct *shmobj;
void *shmp;
int main()
{
//server creates shared memory
if((shmid = shmget((key_t)1234,sizeof(struct shmstruct),0666|IPC_CREAT)) == -1){
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
//server attaches shared memory segment to pointer (void *)
if((shmp = shmat(shmid,(void *) 0,0)) == (void *)-1){
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
//structure is now linked with shared memory pointer
printf("Memory attached at %X\n",shmp);
shmobj = (struct shmstruct *)shmp;
int i;
for(i = 0; i < 50; i++)
if(shmobj->pid[i]!=0)
printf("shminit:i:%d user:%s pid:%d\n", i, shmobj->user[i], shmobj->pid[i]);
}
但每当我创建并附加共享内存段时,shmobj-&gt; pid [1]已经初始化为值2673!
printf的结果始终是:
shminit:i:1 user: pid:2673
关于为什么会发生这种情况的任何想法? 提前谢谢!
答案 0 :(得分:3)
当所有进程从它们分离时,共享内存段不一定会消失。您的服务器很可能只是附加到已存在的段。
IPC_CREATE
没有强制创建,如果该段尚不存在,则允许创建。
您可以考虑使用shm_unlink()
来正确删除共享内存段,或者使用命令行shmdel
来测试它是否有效。