Невозможно запустить программу с общей памятью

Я написал следующие программы в качестве примера с общей памятью. Я хочу написать некоторое сообщение из общей памяти, созданной в файле write.c, и хочу отобразить его в процессе read.c из той же памяти. Но когда я пытаюсь запустить программы, я получаю сообщение об ошибке:

Segmentation fault (core dumped)

Пробовал, но не смог найти ошибку в моем коде.

файл write.c:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

main() {
    key_t key=1235;
    int shm_id;
    void *shm;
    char *message = "hello";
    shm_id = shmget(key,10*sizeof(char),IPC_CREAT);
    shm = shmat(shm_id,NULL,NULL);
    sprintf(shm,"%s",message);
}

файл read.c:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

main() {
    key_t key=1235;
    int shm_id;
    void *shm;
    char *message;
    message = malloc(10*sizeof(char));
    shm_id = shmget(key,10*sizeof(char),NULL);
    shm = shmat(shm_id,NULL,NULL);
    if(shm == NULL)
    {
        printf("error");
    }
    sscanf(shm,"%s",message);
    printf("\n message = %s\n",message);
}

2 ответа

Решение

Проблема не в спринте. Это проблема с разрешениями, когда у вас нет разрешения на присоединение только что созданного сегмента. Когда я запускаю вашу программу "write" как обычный пользователь, shmat завершается с ошибкой и возвращает -1, а затем sprintf, конечно, вылетает. shmat также устанавливает errno на 13 ("Отказано в доступе"). Когда я запускаю его как root, он работает.

Попробуйте это вместо этого (и с новым ключом):

shm_id = shmget(key, 10*sizeof(char), IPC_CREAT | 0777);

Флаги 0777 - это разрешения для сегмента, аналогичные разрешениям для файла.

By tracking the error using printf statement ,

main() {

 key_t key=1235;
 int shm_id;
 void *shm;
 char *message = "hello";
 shm_id = shmget(key,10*sizeof(char),IPC_CREAT);
 printf("hello 1\n");
 shm = shmat(shm_id,NULL,NULL);
 printf("hello 2\n");
 sprintf(shm,"%s",message);
 printf("hello 3\n");

}

I explored that it is giving segmentation fault after executing sprint, so look for the arguments that you passed to function .
Similar is the case for sscanf in read.c
Другие вопросы по тегам