2010-12-11 35 views
1

私は共有メモリセグメントを扱っていて、この問題に遭遇しました。共有メモリ初期化問題(c)

私は多くのプロセス間の構造体を共有しようとしています:[1]すでに値2673で初期化され

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!

printf関数の結果は、常に次のとおりです。なぜこれが起こっているの

shminit:i:1 user: pid:2673 

任意のアイデア?
ありがとうございます!

答えて

3

共有メモリセグメントは、すべてのプロセスがそれらから切り離されても、必ずしも消えない場合があります。あなたのサーバがすでに存在するセグメントに接続している可能性があります。

IPC_CREATEはない作成を行いセグメントがまだ存在しない場合、それは、作成を可能にします。

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

+0

あなたの洞察力をありがとう! IPC_PRIVATEは新鮮な新しいshmセグメントを確実に得ることができるようです。私はそれについての確認を得ることができますか? –

+1

@Littledot、私はあなたが最初にセグメントを作成し、子をフォークすると動作するメモリから考えています。それ以外の場合は、実際にメモリを共有する方法はありません。 – paxdiablo

+0

これはまさに私がやっていることです。子どもを育て、両親と記憶を共有する。それを入れてくれて申し訳ありません。 –