我在 Linux Ubuntu 的 C 语言中创建了两个不相关的守护进程。这些进程处于休眠模式,它们仅在接收到数据时唤醒,并执行在信号处理程序中实现的操作并再次休眠。
我已经使用信号IPC和消息队列实现了这种通信。在发送消息之前,我先发送信号SIGUSR1
,然后发送数据,并编写信号处理程序供SIGUSR1
执行所需的操作。
我想使用 ZeroMQ 实现相同的通信方式,我一直在阅读他们的指南,以了解 ZeroMQ 是否具有任何类型的事件处理或通知方法,当数据到达时(对于 C 语言)。
我也参考了以下链接:
ZeroMQ 是否有数据到达时的通知/回调事件/消息?
但我仍然怀疑。
当发送新数据时,ZeroMQ 是否会通知或触发其他进程某个事件(我不想等待或poll()
直到数据到达,而是我的守护进程将处于休眠状态,当数据到达时,它将执行其处理程序并再次休眠)?
如果有人可以帮助/建议,那就太好了。
No.
在原样状态下,ZeroMQ 既不实现触发器也不实现回调。
为什么?
因为核心消息传递思维方式是使用队列,而不是干扰进程的流程,除非进程本身发现询问队列是可行的(无论是使用智能方式,通过.poll()
进行测试,还是以愚蠢的方式,通过直接调用.recv( ZMQ_NOBLOCK )
),是否有任何消息准备就绪并等待其后处理,然后将.recv()
开始从 ZeroMQ 端线程及其资源并根据自己的流程足迹和工作流程处理它们。
但POSIXSIGNAL
-s机制改变了游戏规则:
鉴于有关 ZeroMQ 本身的事实,SIGUSR1
可以向接收进程提供独立的(只是使用上下文对齐的)">带外"信号,即发送方进程刚刚编组了一些要处理、发送和交付的通信,因此接收进程可以激活并遵循工具和方法,从 ZeroMQ 交付路径中.recv()
数据, 尽管如此,ZeroMQ 机制本身并不提供回调方法。
因此,从这个意义上说,即使是算法的命令式语言实现也变得知道上次 ZeroMQ 调用的成功/失败,O/S POSIX 信令层(完全独立于分布式 ZeroMQ 消息传递/信令传递基础设施)可以提供这种寻求的进程间协调手段,旨在在被测试的进程网络的睡眠/守护进程实例之间工作。