Gra*_*amS 10 c posix ipc shared-memory lynxos
我正在LynxOS SE(POSIX conformant)系统上实现两个进程,它们将通过共享内存进行通信.
一个过程将充当"生产者"而另一个过程将充当"消费者".在多线程系统中,我的方法是使用互斥和condvar(条件变量)对,消费者在condvar(with pthread_cond_wait)上等待,生产者pthread_cond_signal在更新共享内存时用信号通知它(with ).
如何在多进程架构而不是多线程架构中实现这一目标?
是否有LynxOS/POSIX方法来创建可在进程之间使用的condvar/mutex对?
或者在这种情况下,其他一些同步机制更合适吗?
Gra*_*amS 22
归功于@nos,但我想对他的答案进行一些扩展.
最后(为了清晰起见,不包括错误处理)我做了如下:
它包含进程间同步对象和要共享的数据.
typedef struct
{
// Synchronisation objects
pthread_mutex_t ipc_mutex;
pthread_cond_t ipc_condvar;
// Shared data
int number;
char data[1024];
} shared_data_t;
Run Code Online (Sandbox Code Playgroud)
在Master进程上创建一个新的共享内存对象:
fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));
Run Code Online (Sandbox Code Playgroud)
在Slave上只需附加到现有对象:
fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);
Run Code Online (Sandbox Code Playgroud)
shared_data_t* sdata = (shared_data_t*)mmap(0, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
而已.
现在可以正常使用Mutex和cond来控制对共享数据的访问.
唯一真正的问题是确保Master进程创建共享内存并在Slave进程启动之前初始化同步变量.并确保您整理了munmap()和shm_unlink()要求.
该POSIX:XSI扩展对共享内存(其他功能shmget(),shmat()等等),这可能是更有益的,如果他们是可用的,但他们不在的LynxOS-SE的版本我使用.
您可以使用共享内存/信号量IPC来实现。
这是一个带有很好示例的文章:
http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm
创建进程共享互斥锁/ cond的标准方法.变量是使用您设置pthread_mutexattr_setpshared/pthread_condattr_setpshared的属性初始化它们.检查LynxOS是否支持.
你自然需要放置这样的互斥锁/ cond.共享内存中的变量以某种方式,所以所有进程都可以使用它.