Простое сохранение целого числа в сегменте общей памяти: C

#c #ipc #shared-memory

#c #ipc #разделяемая память

Вопрос:

Я просто пытаюсь разделить целое число между двумя процессами, но сегмент памяти инициализирован в программе 1 и используется в программе 4. Вот инициализация в программе 1:

 shmid = shmget(key, sizeof(int*), 0666 | IPC_CREAT);
int *data = (int *)shmat(shmid, (void*)0,0);
  

Здесь я получаю предупреждение о «приведении к указателю из целого числа другого размера». Ага.

Я предполагаю, что это просто, но я большой новичок в IPC. И многое другое на c….

Затем я передаю его другой программе:

 snprintf(shmarg, sizeof(shmarg), "%n", data);
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg, semarg, pipe_from_p2_2, pipe_to_p5_2);
  

Не уверен, как получить к нему доступ с другой стороны. Как я могу вернуть значение int в программе 4?

Ответ №1:

Уверен, что вам не хватает заголовка, который определяет, shmat() и, следовательно, компилятор предполагает, что shmat возвращает значение int (не указатель).

Ответ №2:

Здесь я получаю предупреждение о «приведении к указателю из целого числа другого размера». Ага.

Попробуйте использовать NULL вместо (void*)0 .

Затем я передаю его другой программе:

 snprintf(shmarg, sizeof(shmarg), "%n", data);
pid_t pid3 = run_cmd4("/home/tropix/hw11-4", shmarg,
                      semarg, pipe_from_p2_2, pipe_to_p5_2); 
  

Не уверен, как получить к нему доступ с другой стороны. Как я могу вернуть значение int в программе 4?

Сам указатель бесполезен, если область общей памяти случайно не загружена по точно такому же адресу виртуальной памяти в другой программе: вы, вероятно, даже не хотите пытаться организовать это — вместо этого позвольте другой программе (hw11-4) загрузить сегмент общей памяти и позволить ОС выбрать адрес виртуальной памяти, а затем просто посмотреть на этот адрес для int . Итак, hw11-4 необходимо передать тот же ключ общей памяти (например, в качестве аргумента командной строки) и сам использовать shmget для открытия и получения ключа, а затем shmat для отображения сегмента общей памяти в память….