2012-04-18 138 views
1

構造体の型を共有するコードを記述しようとしていますが、共有メモリ内の構造体メンバに書き込むときにセグメント化エラーが発生する親プロセスと子プロセスの間。コードに表示されているように、今はstructメンバーにアクセスしようとしているので、後で同期のためにセマフォを使うことができます。"C言語で共有メモリの構造体メンバにアクセスする"

Thanx事前に。

typedef struct file 
{ 
    char *shmPtr; 
} file_entry; 

int main (void) 
{ 

    int shmid; 
    int n; 
    file_entry *entries; 

    if (fork() == 0) { 
     /*wait for a while*/ 

     if ((shmid = shmget(20441, sizeof(file_entry), 0666)) == -1) { 
      printf("shmget"); 
      exit(2); 
     } 

     entries = (file_entry*) shmat(shmid, 0, 0); 
     if (entries->shmPtr == (char *) -1) { 
      printf("problem2"); 
      exit(2); 
     } 

     printf("\nChild Reading ....\n\n"); 
     printf("%s\n", entries->shmPtr[0]); 
     printf("%s\n", entries->shmPtr[1]); 
     putchar('\n'); 
     printf("\nDone\n\n"); 
    } else { 
     if ((shmid = shmget(20441, sizeof(file_entry), IPC_CREAT | 0666)) == -1) { 
      printf("problem3"); 
      exit(2); 
     } 

     entries = (file_entry *) shmat(shmid, 0, 0); 
     if (entries->shmPtr == (char *) -1) { 
      printf("problem4"); 
      exit(2); 
     } 
     printf("done attachment"); /*the parent prints this statment, then segmentation fault*/ 

     entries->shmPtr[0]='a'; 
     entries->shmPtr[1]='b'; 
     putchar('\n'); 

     wait(); 
     shmdt(&shmid); 
    } 
    exit(0); 
} 

答えて

1

shmatは、共有メモリ領域へのポインタを返します。あなたのコードでは、shmatを呼び出した後、entriesは共有領域を指しています。その共有領域の最初の数バイトをchar(shmPtr)へのポインタとして扱います。 shmPtrの値は初期化されておらず、ランダムな場所を指しています。それからあなたはそれに書き込んで、セグメンテーションを取得しようとします。

編集:

リチャードが示唆したように、あなたは構造体を取り除くだけchar *を使用することができます。しかし、structを使用している理由を推測しているだけでなく、char *ではなく、今後構造体にいくつかの追加フィールドを追加する予定です。その場合は、あなたが柔軟な配列メンバー使用することができます。

typedef struct file 
{ 
    int flag; 
    int blah; 
    char shmPtr[]; 
} file_entry; 

をし、バッファサイズが固定されている場合割り当ては、もちろん

shmget(20441, sizeof(file_entry) + bufsize, IPC_CREAT | 0666) 

となり、あなたはそれをハードコーディングできます。

typedef struct file 
{ 
    int flag; 
    int blah; 
    char shmPtr[BUFSIZE]; 
} file_entry; 

/* ... */ 
shmget(20441, sizeof(file_entry), IPC_CREAT | 0666) 
+0

私は、file_entryがchar *にtypedefされるべきであることを具体的に説明します。 –

+0

@ g.inozemtsevありがとう、私の問題を解決しました。 – CodeRed

関連する問題