2016-10-31 5 views
0

同じ共有メモリにアクセスする2つのプロセスがあります。しかし、私は共有メモリに動的に割り当てられた配列を保存したい。私はこれが柔軟な配列メンバーを使って達成できることを知っていますが、私はそれらを使用することはできません。C共有メモリ内の構造体ポインタ(mmap)

サーバからダイナミックアレイを割り当ててアクセスできますが、クライアントがアクセスしようとするたびにsegfaultが取得されます。それにもかかわらず、私は他の構造メンバーにアクセスできます。ここに私のコードのロジックです。私は共有メモリセグメントの最後に余分なスペースを割り当て、セグメントの終わりを指すように配列を設定しました。

struct A{ 
    int a; 
    struct B *other; 
} 
struct B{ 
    int b; 
} 
... 
//Server 
fd=shm_open("shared", O_CREAT | O_RDWR, 0666); 
ftruncate(fd, sizeof(struct A)+200*sizeof(struct B)); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
ptr->other=(struct B *)(ptr+1);  
int i=0; 
for(i=0;i<200;i++){ 
    struct B b; 
    ptr->other[i]=b; 
} 
... 
//Client 
int fd=shm_open("shared", O_RDWR, 0666); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
printf("%i", ptr->other[0]);// SEGFAULT 

助けてください。

+4

を他のリストを定義することでした。プロセス間でポインタを渡すことはできませんが、共有メモリの先頭からオフセットを渡すことができます。 – EOF

+0

ありがとう、私はそれを私の構造体内の他のポインタを破棄し、単純に構造体B *を他の=(構造体B *)(ptr + 1)クライアントとサーバーの両方で行っています。 – user1354784

答えて

0

溶液は、共有メモリは、通常、異なるプロセス内の異なるアドレスにマッピングされる構造の外側

struct A{ 
    int a; 
} 
struct B{ 
    int b; 
} 
... 
//Server 
fd=shm_open("shared", O_CREAT | O_RDWR, 0666); 
ftruncate(fd, sizeof(struct A)+200*sizeof(struct B)); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
struct B *other=(struct B *)(ptr+1);  
int i=0; 
for(i=0;i<200;i++){ 
    struct B b; 
    other[i]=b; 
} 
... 
//Client 
int fd=shm_open("shared", O_RDWR, 0666); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
struct B *other=(struct B *)(ptr+1); 
printf("%i", other[0]); 
関連する問題