Назначение строк в процессах общей памяти

У меня есть программа, которая должна делиться цепочкой между двумя процессами. Я объявил структуру, содержащую массив *char . Эта структура распределяется с помощью shmget и shmat до того, как основной процесс будет разветвлен.

 typedef struct Queue { int index; char *directory[10]; } Queue; 

В одном из процессов я пытаюсь установить значение: ( data->dir_name является data->dir_name *char для строки, такой как «/ data1»)

 queue->directory[i] = data->dir_name; // Option 1 queue->directory[i] = "foo"; // Option 2 

Мой вопрос: в чем разница между первым и вторым высказываниями выше? При настройке queue->directory[i] на "foo" другой процесс видит это. Однако, передавая значение data->dir_name , это не так.

Заранее спасибо!

Проблема в том, что вы назначаете указатель, а не копируете строковые данные. В первом случае вы устанавливаете значение для указания на то, что второй процесс не видит. Когда вы делаете первую строку, указатель data->dir_name помещается в queue->directory[i] , но когда другой процесс смотрит на этот адрес памяти в пределах своего собственного пространства памяти, данных нет. С другой стороны, вторая строка помещает в переменную адрес статической строки "foo" . Поскольку процессы скомпилированы из одного источника, эта строка находится в одном месте в памяти каждого процесса, поэтому вторая может видеть ее.

То, что вы хотите делать, это наличие буфера в структуре, в которую вы вставляете имя каталога. Тебе понадобиться

 char directory[10][200]; 

а также

 strcpy (queue->directory[i], data->dir_name); 

Вы захотите проверить, что длина строки меньше 200 (в данном случае) и сообщать соответствующую ошибку, если она слишком длинная. Я не знаком с функциями общей памяти, чтобы точно знать, как сделать эквивалент malloc ; если бы вы могли это сделать; то вы должны скопировать строку в общую память malloc ed и поместить в нее указатель в массиве, подобном вашему коду. Однако из очень быстрого поиска Google, похоже, что такая разделяемая память может не работать очень хорошо.