Кредит идет на @nos, но я бы хотел немного расширить его ответ.
В конце (за исключением обработки ошибок для ясности) я сделал следующее:
1.Определите структуру общей памяти
. Содержит объекты межпроцессной синхронизации и данные для совместного использования.
typedef struct
{
// Synchronisation objects
pthread_mutex_t ipc_mutex;
pthread_cond_t ipc_condvar;
// Shared data
int number;
char data[1024];
} shared_data_t;
2.Создайте общую память и установите размер (мастер-процесс)
. В процессе Master создайте новый объект совместно используемой памяти:
fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));
2.ИЛИ Откройте общую память (подчиненный процесс)
На подчиненном просто подключите к существующему объекту:
fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);
3.Mmap в пространство процесса
shared_data_t* sdata = (shared_data_t*)mmap(0, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
4.Инициируйте переменные синхронизации (только основной процесс)
pthread_mutexattr_t mutex_attr;
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&sdata->ipc_mutex, &mutex_attr);
pthread_condattr_t cond_attr;
pthread_condattr_init(&cond_attr);
pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&sdata->ipc_condvar, &cond_attr);
Вот и все.
Mutex и cond теперь можно использовать в обычном режиме для управления доступом к общим данным.
Единственный реальный недостаток - убедиться, что мастер-процесс создал общую память и инициализировал переменные синхронизации до запуска подчиненного процесса.И убедитесь, что вы привели в порядок munmap()
и shm_unlink()
, как требуется.
Примечание: Альтернатива XSI
Расширение POSIX: XSI имеет другие функции для совместного использования памяти (shmget()
, shmat()
и т. Д.), Которые могут быть более полезными , если они доступны, но они не соответствуют используемой мной версии LynxOS-SE.