Невозможно запустить программу с общей памятью
Я написал следующие программы в качестве примера с общей памятью. Я хочу написать некоторое сообщение из общей памяти, созданной в файле 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