14

我正在LynxOS SE(符合 POSIX 标准)系统上实现两个进程,它们将通过共享内存进行通信。

一个过程将充当“生产者”,而另一个过程将充当“消费者”。在多线程系统中,我的解决方法是使用互斥锁和 condvar(条件变量)对,当共享内存更新时,消费者等待 condvar(with pthread_cond_wait),生产者发出信号(with )。pthread_cond_signal

如何在多进程而不是多线程架构中实现这一点?

是否有 LynxOS/POSIX 方法来创建可在进程之间使用的 condvar/mutex 对?
还是在这种情况下其他一些同步机制更合适?

4

4 回答 4

28

归功于@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进入进程空间

// 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);

就是这样。

现在可以正常使用 Mutex 和 cond 来控制对共享数据的访问。

唯一真正的问题是确保主进程已创建共享内存并在从属进程启动之前初始化同步变量。munmap()并确保您根据需要进行整理shm_unlink()

注意:XSI 替代品

POSIX:XSI 扩展具有其他用于共享内存(等)的功能,shmget()如果它们shmat()可用,它们可能会更有用,但它们不在我使用的 LynxOS-SE 版本上。

于 2010-04-08T23:22:38.360 回答
8

这是通过未命名的 POSIX 信号量完成的,即信号量本身被放置在共享内存中。

于 2010-04-06T12:48:35.547 回答
8

创建进程共享互斥体/条件的标准方法。变量是使用您设置 pthread_mutexattr_setpshared/pthread_condattr_setpshared 的属性来初始化它们。检查 LynxOS 是否支持。

您自然需要放置这样的互斥锁/条件。共享内存中的变量,所以所有进程都可以使用它。

于 2010-04-06T17:39:37.760 回答
6

您可以使用共享内存/信号量 IPC 来实现这一点。

这是一篇带有一个很好例子的文章:

http://www-personal.washtenaw.cc.mi.us/~chasselb/linux275/ClassNotes/ipc/shared_mem.htm

于 2010-04-06T12:28:07.163 回答