2014-10-30 5 views
1

У меня есть структура данных, которая действует как буфер. Это две структуры, которые имеют цвет 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); 
+0

Каков тип цвета в: ptr-> buf1.color = color; ? – afic

+0

Цвет char * цвет; а затем цвет = «КРАСНЫЙ»; Мне удалось решить проблему, используя strcpy и char color [8] в структуре вместо использования указателей, но мне интересно, является ли это единственным способом. Я нашел решение здесь: http://stackoverflow.com/questions/15534923/assigning-strings-in-shared-memory-processes Интересно, что эти проблемы не возникали с потоками. – mobone

+0

Приходят на ум две возможности: (1) вы помещаете данные в сегмент разделяемой памяти или вы их раскладываете? (2) Оба процесса сопоставляют общий сегмент с одним и тем же виртуальным адресом? Если не на втором, указатель, как видно потребителю, будет указывать на неправильное место. Если это неясно, я бы предложил показать нам код для сопоставления разделяемой памяти и выделения буферов. – DoxyLover

ответ

1

Даже если buf может быть в общей памяти, что не гарантирует, что color также указывает на то, в общей памяти. Я предполагаю, что color указывает на какой-то адрес, который доступен только для процесса производителя, а не для потребительского процесса. Чтобы исправить это, вы могли бы определить color поле как массив фиксированной длины полукокса, а также использовать

strncpy(ptr->buf1.color, color, BUFLEN); 
ptr->buf1.color[BUFLEN-1] = '\0'; 

установить цвет.

0

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

typedef struct { 
    char *color; 
    struct timeval time; 
} data_struct; 


data_struct *temp=(data_struct*)malloc(sizeof(data_struct)); 

temp->color = (char *)malloc(strlen(color)+1); 

strcpy(temp->color, color); 

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

free(temp->color); 
    free(temp); 
0

Это не работает, потому что у вас есть один процесс, в котором хранится указатель, и отдельный процесс, который читает этот указатель. Но эти два процесса не имеют одинакового адресного пространства, поэтому при чтении указатель не имеет смысла. Вы можете решить эту проблему несколькими способами:

  1. Использовать потоки вместо процессов; таким образом, у производителя и потребителя будет одно адресное пространство, а указатели от одного будут действительными в другом.
  2. Сохраните текст непосредственно в структуре без указателя (т. Е. char color[30]).
  3. Храните «указатель смещения» в структуре и сохраняйте данные символа в другом месте в области разделяемой памяти (своего рода распределитель пула).
  4. Сделайте массив фиксированных строк у производителя и потребителя и просто сохраните индекс в этой таблице поиска. Это работает, если строки известны заранее.
+0

Но я подумал, что когда вы разыгрываете процесс, ребенок наследует все те же элементы памяти. – mobone

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