我正在制作一个需要同时使用套接字 io 和共享内存的消息传递服务。无论输入来自何处,例程都是相同的,唯一的区别是本地消息将通过共享内存传递,而非本地消息通过套接字传递。这两个事件都必须取消阻止相同的 pselect 调用。在这一点上,我认为最好的选择可能是在将消息写入共享内存时发送信号并使用它来中断 pselect 调用,但我不太确定这将如何完成,即使它是最好的路线。
我不习惯使用信号。实现这一目标的最佳方法是什么?
如果您只想在进程之间发出信号而不是传递数据,那么 eventfd(请参阅eventfd(2))将允许您使用 select() 比管道更少的开销。与管道解决方案一样,流程将需要父/子关系。
如果您想使用信号,请使用sigqueue
发送它们 - 您可以使用它发送整数有效负载,例如共享内存的偏移量。
确保注册您的信号处理程序sigaction
并使用sa_sigaction
回调:该siginfo_t->si_int
成员将包含该有效负载。
一般来说,我不确定我是否可以推荐使用这种机制而不是 unix 管道或 eventfd,因为我不确定信号传递是否真的像你希望的那样针对速度进行了调整:确定基准。
PS。撇开性能不谈,信号感觉有点恶心的一个原因是您失去了拥有像 inet 或 unix 端口这样的“知名”集合点的机会,而不得不去寻找 PID。此外,您必须非常小心掩蔽以确保将信号传递到您想要的位置。
聚苯乙烯。你提出或发送一个信号 - 你不扔它。那是例外。
我做了一些额外的查找并遇到了signalfd(2)。我相信这将是最好的解决方案——与 Basile Starynkevitch 的建议非常相似,但没有标准管道的开销,并且在内核而不是用户空间内完成。
管道+选择+队列+锁,仅此而已。