Вы не можете осмысленно передать указатель от одного процесса другому, потому что указатель не имеет смысла в другом процессе.Каждый процесс имеет свою собственную память, и адрес относительно этого пространства памяти.Другими словами, менеджер виртуальной памяти позволяет каждому процессу притворяться, что он имеет всю память машины;другие процессы просто невидимы.
Однако у вас есть несколько вариантов настройки связи между связанными процессами.Наиболее очевидным является труба, с которой вы, вероятно, уже сталкивались.Однако это больше работы, потому что вам нужно убедиться, что какой-то процесс всегда прослушивает канал связи.
Другая простая возможность - просто оставить файловый дескриптор открытым, когда вы выполняете fork и exec (см. Подробнее-exec флаг, чтобы увидеть, как этого добиться);хотя mmap
не сохраняется exec
, вы можете переназначить память на открытый файл в дочернем процессе.Если вы не хотите передавать fd, вы можете отобразить память во временный файл и использовать переменную окружения, чтобы записать имя временного файла.
Другая возможность - Общая память Posix..Опять же, вы можете сообщить имя shm через переменную окружения, а не жестко кодировать его в приложении.
Обратите внимание, что ни общие карты, ни общая память не являются атомарными.Если вы увеличиваете счетчик, вам нужно использовать некоторый механизм блокировки, чтобы избежать условий гонки.
Чтобы получить гораздо больше информации, чем вы на самом деле хотели, вы можете прочитать обзор ESR методов межпроцессного взаимодействия в Глава 7 Искусство программирования Unix .