感谢@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. 创建共享内存并设置大小(主进程)
在主进程中创建一个新的共享内存对象:
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映射到进程空间中
// Specify addr of calling address, mostly use NULL is most portable way
shared_data_t* sdata = (shared_data_t*)mmap(NULL, 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);
就这样。
互斥锁和条件变量现在可以像正常情况下一样用来控制对共享数据的访问。
唯一真正需要注意的是,在启动从进程之前,主进程必须创建共享内存并初始化同步变量。并确保您根据需要进行整理 munmap()
和 shm_unlink()
。
注意:XSI备选方案
POSIX:XSI扩展具有其他用于共享内存的函数(shmget()
、shmat()
等),如果它们可用,则可能更有用,但它们不适用于我正在使用的LynxOS-SE版本。
pthread_condattr_setpshared
但我错过了pthread_attr_setscope
。如果您将您的评论更改为答案,我会点赞它。 - GrahamS