Я пытаюсь понять 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
. Что может быть причиной этого? Что я делаю не так?