共享内存中用于两个进程的结构数组

| 我正在尝试创建一个结构数组,以便使用\“ shmget \”在父进程和子进程之间共享。我正在遵循教授的模板,但是他的模板不包含结构和数组(共享内存仅存储一个int)。以下代码编译时没有警告,但返回\“ 0 \”作为输出,我希望看到\“ a 10 \”。我究竟做错了什么? 当我尝试在子进程中声明新变量时,我也遇到了麻烦,我看到了其他可以在其中运行的示例,但是我不知道为什么每次都要在派生之前被迫声明它们。
typedef struct { 
    char character;
    int number;
} item;

int main(int argc, char *argv[])
{
    int mem_id;

    mem_id = shmget(IPC_PRIVATE, 10*sizeof(item), SHM_R | SHM_W);
    item * x;
    item * y;
    item * list[10];

    switch(fork())
    {
        case -1:
            perror(\"Bad fork()\"); exit(1);
        case 0:
            *list = shmat(mem_id, NULL, 0);
            if ((int *) list == (int *) -1)
            {perror(\"Child cannot attach\"); exit(1);}           

            x->character = \'a\';
            x->number = 10;

            list[0] = x;

            shmdt(list);
            exit(0);
        default:
            *list = shmat(mem_id, NULL, 0);
            if ((int *) list == (int *) -1)
            {perror(\"Child cannot attach\"); exit(1);}

            wait((int *)0);
            y = list[0];
            shmdt(list);

            printf(\"%c %d\\n\", y->character, y->number);

            if (shmctl(mem_id, IPC_RMID, 0) <0)
                { perror(\"cannot remove shared memory\"); exit(1);}

            return 0;
    }
    return 0;
}
    
已邀请:
        我很惊讶您没有进行以下操作: 您不会像Nemo所指出的那样初始化x 您的数组“列表”实际上是指向Items的指针数组,而不是Items数组。 最重要的是。在打印出y中的值之前,请先分离共享内存。 该代码应如下所示:
typedef struct { 
    char character;
    int number;
} item;

int main(int argc, char *argv[])
{
    int mem_id;

    mem_id = shmget(IPC_PRIVATE, 10*sizeof(item), SHM_R | SHM_W);
    item *x;
    item *y;
    item *list;

    switch(fork())
    {
    case -1:
        perror(\"Bad fork()\"); exit(1);
    case 0:
        list = (item *)shmat(mem_id, NULL, 0);
        if ((void *) -1 == (void *)list)
        {
            perror(\"Child cannot attach\"); exit(1);
        }
        x = list;
        x->character = \'a\';
        x->number = 10;

        shmdt(list); // No need for this
        exit(0);
    default:
        list = (item *)shmat(mem_id, NULL, 0);
        if ((void *) list == (void *) -1)
        {
           perror(\"Child cannot attach\"); exit(1);
        }

        wait((int *)0);
        y = list;
        printf(\"%c %d\\n\", y->character, y->number);

        shmdt(list);

        if (shmctl(mem_id, IPC_RMID, 0) <0)
            { perror(\"cannot remove shared memory\"); exit(1);}

        return 0;
    }
    return 0;
}
    

要回复问题请先登录注册