Я использую массив структур для обмена данными между двумя процессами. Программа после 3 секунд повышает ошибку Segmentation fault
, когда я пытаюсь получить доступ к общей памяти в родительский процесс. Почему данные неправильно распределены?Общая память с массивом структур
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define LEN 3
typedef struct {
int val;
} val_t;
int
main (int argc, char *argv[])
{
key_t key;
int shmid, i, size;
val_t **val;
if ((key = ftok(argv[0], 'D')) == -1) {
perror("ftok");
exit(1);
}
size = sizeof(val_t *) * LEN;
if (fork() == 0) {
if ((shmid = shmget(key, size, IPC_CREAT | IPC_EXCL | 0666)) == -1) {
perror("shmget");
exit(1);
}
val = (val_t **) shmat(shmid, 0, 0);
if (val == (val_t **)(-1)) {
perror("shmat");
exit(1);
}
for (i = 0; i < LEN; i++) {
val[i] = (val_t *) malloc(sizeof(val_t));
val[i]->val = i;
}
while (val[0]->val != 3)
sleep(1);
if (shmdt(val) == -1) {
perror("shmdt");
exit(1);
}
shmctl(shmid, IPC_RMID, NULL);
}
else {
sleep(3);
if ((shmid = shmget(key, size, IPC_EXCL)) == -1) {
perror("shmget");
exit(1);
}
val = (val_t **) shmat(shmid, 0, 0);
if (val == (val_t **)(-1)) {
perror("shmat");
exit(1);
}
printf("%d\n", val[0]->val);
val[0]->val = 3;
if (shmdt(val) == -1) {
perror("shmdt");
exit(1);
}
}
return 0;
}
1) Нет массива 'struct'. У вас есть указатель на указатель на 'struct', но, вероятно, вы хотите« указатель на 'struct'» в соответствии с вашим названием. 2) Не бросайте результат 'malloc' & friends в C. 3) Не уверен, но если' val' является общим массивом, почему вы устанавливаете указатели на «частную» память? 4) У вас, по-видимому, проблемы с множественной косвенностью в разных местах. – Olaf