异步共享内存读/写

3
在我的应用程序中,我使用共享内存进行父子进程间的IPC(在Linux和Windows上都是如此)。Linux的完整代码位于https://github.com/devendermishra/SharedMemoryTest/blob/master/shmem_linux.cpp。以下是我在Linux上读取共享内存的代码:
char buf[BUF_SIZE/4];
//pBuf is the shared memory location

sem_wait(semn);
//Wait for the parent process to write on the shared memory.
memcpy(buf, pBuf, sizeof(buf));
//Signal the parent
sem_post(sem0);

以下是需要编写的代码:

//Data is in buf, pBuf is shared memory.
memcpy(buf, pBuf, sizeof(buf));
sem_post(semn);
sem_wait(sem0);

在这种情况下,如果一个进程长时间不写入,那么其他进程将无限等待。一种解决方案是使用sem_trywait,如果操作无法完成,则立即返回。但在这种情况下,需要有人再次调用sem_trywait来检查它是否可以被锁定。像文件一样,是否有类似于selectpoll的机制来检查多个信号量的状态,如果有任何一个被触发,则执行操作而不是在单个信号量上被阻塞?
1个回答

3

对于Posix信号量,没有类似于poll的机制。

我建议使用管道;它由常规文件描述符管理,因此您可以使用poll等来等待它。

最简单的用法是将所有数据通过管道传递,而不是共享内存。如果复制数据进出内核内存的成本可能会成为问题,则可以保留共享内存,并通过管道发送单个字符作为信号,有效地将其用作信号量。


谢谢您的快速回答。我认为即使是Unix套接字和临时文件也可以用作信号。这些中哪一个性能更好?选择管道作为信号而不是其他方式是否有原因? - doptimusprime
@dbasic:Unix套接字可能具有与管道类似的行为和性能,但我对它们不太了解。我不会使用文件;其行为不适合简单传输数据,将其写入磁盘可能会影响性能,并且其持久性可能会在启动和停止程序时引起复杂性。 - Mike Seymour
这个问题不是关于管道而是信号量的,这是两种不同的进程间通信方式。你没有回答这个问题。 - Maciej
@Maciej: "是否有类似于selectpoll的机制来检查多个信号量的状态?" 对于信号量没有这样的机制,因此我描述了一种替代方法。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接