У меня есть структура данных, которая действует как буфер. Это две структуры, которые имеют цвет char * внутри них. Я могу хранить и получать правильный цвет из каждого процесса производителя самостоятельно, но потребитель, похоже, ничего не видит в цветовой переменной, хотя он знает, что он не является нулевым. Как это может быть?Строка не отображается правильно после сохранения в общей памяти
typedef struct {
char *color;
struct timeval time;
} data_struct;
typedef struct{
data_struct buf1;
data_struct buf2;
} buffer;
В производителе хранит:
ptr->buf1.color = color;
gettimeofday (&tval, NULL);
ptr->buf1.time = tval;
И я могу тогда напечатать цвет он просто запоминается и он работает в рамках одного процесса. Но потребитель использует:
printf("%s\t", ptr->buf1.color);
struct timeval tval = ptr->buf1.time;
printf("%ld\n", (tval.tv_sec)*1000000L + tval.tv_usec);
И он только заканчивает печать пустую область, затем вкладку, затем время в секундах. Как он обращается к одной и той же общей памяти, но не видит мою строку? Этот примерно идентичный код отлично работает в поточной версии. Спасибо за вашу помощь!
Обновление с разделяемыми сегментами памяти.
int shmem_id;
buffer *shmem_ptr;
key_t key = 7484;
int size = 2048;
int flag = 1023;
char keystr[10];
/* create a shared memory segment */
shmem_id = shmget (key, size, flag);
shmem_ptr = shmat (shmem_id, (void *) NULL, 1023);
shmem_ptr->buf1.color = NULL;
shmem_ptr->buf2.color = NULL;
sprintf (keystr, "%d", key);
Каков тип цвета в: ptr-> buf1.color = color; ? – afic
Цвет char * цвет; а затем цвет = «КРАСНЫЙ»; Мне удалось решить проблему, используя strcpy и char color [8] в структуре вместо использования указателей, но мне интересно, является ли это единственным способом. Я нашел решение здесь: http://stackoverflow.com/questions/15534923/assigning-strings-in-shared-memory-processes Интересно, что эти проблемы не возникали с потоками. – mobone
Приходят на ум две возможности: (1) вы помещаете данные в сегмент разделяемой памяти или вы их раскладываете? (2) Оба процесса сопоставляют общий сегмент с одним и тем же виртуальным адресом? Если не на втором, указатель, как видно потребителю, будет указывать на неправильное место. Если это неясно, я бы предложил показать нам код для сопоставления разделяемой памяти и выделения буферов. – DoxyLover