#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
для отображения сегмента общей памяти в память….