2016-12-07 3 views
2

У меня есть 2 программы, которым необходимо обмениваться памятью. Назовем одну программу А, другой Б.Ошибка сегментации при доступе к общей памяти в C

Существует структура в этом формате для этой цели:

struct town_t { 
    int population; 
    char * name; 
} 

В программе A, получает данные записываются в общую память, используя ММАП. Это работает для программы A. (Используется strcpy для name)

Цель программы B - просто прочитать данные. Это тоже работает с mmap. Доступ к полем population общей памяти работает без проблем. Однако доступ к полю population дает ошибку сегментации.

Поскольку я использовал strcpy, вся строка должна быть в общей памяти правильно?

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

tptr = (struct town_t *) mmap(0, 1024, PROT_READ, MAP_SHARED, shm_fd, 0) 

Как я могу это сделать, чтобы действительно прочитать строку (char *) из программы B?

+1

Использование 'strcpy' не имеет никакого отношения к тому, является ли строка в общей памяти. Какую память указывает «имя» и как вы выделили эту память? – immibis

+0

@immibis Я использую strcpy для указателя общей памяти. Я выделяю char * str = "string". –

+0

Итак, вы делаете 'tptr = mmap (...); char * str = "string"; strcpy (tptr-> name, str); '? – immibis

ответ

1

Нет смысла размещать указатель в общей памяти. Указатель дает местоположение внутри адресного пространства определенного процесса. Это не имело бы смысла для другого процесса с другим адресным пространством. (С некоторыми сложными исключениями, такими как указатель на память, выделенный перед вызовом fork, с помощью связанных процессов, выполняющих один и тот же исполняемый файл.)

Вы можете сохранить строковые данные в общей памяти, если хотите. Например, это будет работать:

#define MAX_NAME_SIZE 100 

struct town_t 
{ 
    int population; 
    char name[MAX_NAME_SIZE]; 
}; 
+0

Это работает. Еще раз спасибо. –

Смежные вопросы