【问题标题】:Shared memory initialization problem (c)共享内存初始化问题(三)
【发布时间】:2011-05-23 22:36:30
【问题描述】:

我正在处理共享内存段,遇到了这个奇怪的问题。

我正在尝试在多个进程之间共享一个结构:

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->pid[1] 已经初始化为值 2673!

printf 的结果总是:

shminit:i:1 user: pid:2673

关于为什么会发生这种情况的任何想法?
提前谢谢!

【问题讨论】:

    标签: c initialization init shared-memory


    【解决方案1】:

    当所有进程都从它们分离时,共享内存段不一定会消失。您的服务器很可能只是附加到已经存在的段。

    IPC_CREATE强制创建,它允许在段尚不存在时创建。

    您可以考虑使用shm_unlink() 正确删除共享内存段,或者使用命令行shmdel 进行测试。

    【讨论】:

    • 非常感谢您的洞察力!看来 IPC_PRIVATE 可以确保我得到一个全新的 shm 段。我可以得到确认吗?
    • @Littledot,我从记忆中认为,如果您先创建段然后分叉子项,这将起作用。否则,就无法真正共享​​>内存。
    • 这正是我正在做的。分叉孩子并与他们的父母分享记忆。很抱歉没有把它放进去。
    猜你喜欢
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多