Ошибка сбоя сегментации при попытке чтения из общей памяти - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь понять API-интерфейсы разделяемой памяти System V. Я создал небольшую программу, где один пишет в общую память, а другой читает из общей памяти. Но по какой-то причине я получаю сообщение об ошибке:

segmentation fault: 11

при попытке чтения из общей памяти. Я не мог найти причину для этого.

Вот что я сделал:

Следующая программа записывает в общую память.

    #include <stdio.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>

    struct shm_seg {
        char *buf;
    };

    int main() {
        int shmid = shmget(1, sizeof(struct shm_seg), IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);

        if(shmid == -1) {
            printf("Failed to fetch the shared memory id");
            exit(-1);
        }

        struct shm_seg *shm_segp = shmat(shmid, NULL, 0);

        if(shm_segp == (void*)-1) {
            printf("Failed to attach shared memory to the shared memory id");
            exit(-1);
        }

        while (1) {
            shm_segp->buf = "hello";
        }

        if(shmdt(shm_segp) == -1) {
            printf("Failed to detach the shared memory");
            exit(-1);
        }

        if(shmctl(shmid, IPC_RMID, 0) == -1) {
            printf("Failed to delete a shared memory object");
            exit(-1);
        }
    }

и следующий код попытка чтения из общей памяти.

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>

struct shm_seg {
    char *buf;
};

int main() {
    int shmid = shmget(1, 0, 0);

    if(shmid == -1) {
        printf("Failed to fetch the shared memory id");
        exit(-1);
    }

    struct shm_seg *shm_segp = shmat(shmid, NULL, SHM_RDONLY);

    if(shm_segp == (void*)-1) {
        printf("Failed to attach shared memory to the shared memory id");
        exit(-1);
    }

    int i = 0;
    while(i < 100 ) {
        printf("%s\n",shm_segp->buf);
        i++;
    }


    if(shmdt(shm_segp) == -1) {
        printf("Failed to detach the shared memory");
        exit(-1);
    }
}

Приведенная выше программа чтения приводит к ошибке Segmentation fault: 11. Что может быть причиной этого? Что я делаю не так?

1 Ответ

3 голосов
/ 08 марта 2020
        shm_segp->buf = "hello";

Этот код не имеет смысла. Это помещает указатель в разделяемую память.

Ваш код передает указатель на строковую константу из одной программы в другую. Затем он разыменовывает этот указатель в другой программе. Но какой в ​​этом смысл? Это указатель на область памяти другой программы, которая ничего не значит для другой программы.

Если вы хотите передавать данные из одной программы в другую, вам нужно фактически поместить данные, которые вы хотите передать, в общую память. Помещение указателя в общую память не принесет пользы, если сами данные не находятся в общей памяти!

...