1

構造体タイプを共有するコードを書き込もうとしていますが、共有メモリの構造体メンバーに書き込もうとするとセグメンテーションエラーが発生し、共有メモリは親プロセスと子プロセスの間にあります。コードに示されているように、今のところstructメンバーにアクセスしようとしているだけなので、後で同期のためにセマフォを使用できます。

よろしくお願いします。

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);
}
4

1 に答える 1

1

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

編集:

リチャードが提案したように、構造体を取り除き、を使用することができますchar *structただし、aだけでなくaを使用している理由は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)
于 2012-04-18T19:16:42.093 に答える