1

私のプロセスは、すでに作成されている共有メモリにアクセスしています。共有メモリにアタッチされたポインタは、ポインタと 2 つまたは 3 つの変数を含む構造体です。

例えば:

typedef struct _info_t{
    int id;
    char c;
}info_t;

typedef struct _details_t{
    int buff_id;
    info_t* info;
}details_t;

details_t* details = shmat(shmid,(void*)0,0);
printf("\n %d \n",details->info->id);            // gives me a segmentation fault
4

2 に答える 2

5

メモリ セグメントが複数のプロセス間で共有されている場合、同じアドレスにマップされる保証はないため、共有メモリ セグメントにポインタを格納することはできません。ポインターの使用を避け、オフセットまたは配列を使用してください (可能な場合)。

于 2013-09-15T17:05:45.293 に答える
1

shmat(2)は syscall (Linux 上) です。失敗する場合があります。だから少なくともコード

details_t* details = shmat(shmid,(void*)0,0);
if (!details) { perror("shmat"); exit(EXIT_FAILURE); };  

また、アドレスは各プロセスに固有であるため、(簡単に) ポインタを共有メモリに配置することはできません。

于 2013-09-15T17:06:02.907 に答える