1

私は共有メモリセグメントを扱っていて、この奇妙な問題に遭遇しました。

多くのプロセス間で構造体を共有しようとしています:

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

なぜこれが起こっているのかについてのアイデアはありますか?
前もって感謝します!

4

1 に答える 1

3

すべてのプロセスが共有メモリ セグメントから切り離されても、共有メモリ セグメントが消えるとは限りません。サーバーが既存のセグメントに単に接続している可能性は十分にあります。

IPC_CREATE作成を強制しません。セグメントがまだ存在しない場合は作成できます。

shm_unlink()共有メモリセグメントを適切に削除するために使用するか、コマンドラインshmdelでこれをテストすることができます。

于 2010-12-11T13:12:35.110 に答える