用例是一个应用程序生成一个事件并发出一个信号,任何愿意监听它的应用程序都会得到。例如,应用程序更新文件的内容并发出信号。在 Linux 上,这可以通过服务员对文件调用 inotify 来完成。一种可移植的方式是让听众注册一个知名的服务器,但如果可能的话,我更喜欢更简单的方法。尽可能便携意味着只使用广泛可用的 POSIX 功能。
问问题
158 次
2 回答
1
使用锁定文件的选项
您可以通过锁定文件来做到这一点。
信号发射器初始设置:
- 创建一个具有众所周知名称的文件并将其锁定以供写入(
fcntl(F_SETLK)
withF_WRLCK
或 flock(LOCK_EX)`)。
信号接收程序:
- 使用众所周知的文件名打开文件,并尝试获得对其的读取锁定(
fcntl(F_SETLK)
使用F_RDLCK
或flock(LOCK_SH)
)。 - 接收器阻塞,因为发射器持有一个冲突的写锁。
信号发射:
- 信号发射器创建一个新的临时文件
- 信号发射器在新的临时文件上获得写锁
- 信号发射器将新的临时文件重命名为众所周知的文件名。这会破坏旧的锁定文件,但等待的接收者都保留对它的引用。
- 信号发射器关闭旧的锁定文件。这也释放了锁。
- 信号接收者都被唤醒,因为现在他们可以获得他们的读锁。
- 信号接收者应该关闭他们刚刚获得锁定的文件。它不会再被使用。如果他们想等待这种情况再次发生,他们应该重新打开文件。
在信号发射器中,已在原始锁定文件之上重命名的临时锁定文件现在成为新的当前锁定文件。
使用网络多播的选项
让接收者加入多播组并等待数据包。让信号发射器向该多播组发送 UDP 数据包。
如果您希望它仅使用主机本地通信,则可以将发送和接收 UDP 套接字绑定到环回接口。
于 2012-01-05T11:32:05.687 回答
0
最后我使用了一个绑定的 unix 域套接字。所有者保留一组客户端 FD,并在发生事件时向每个客户端发送一条消息。
于 2014-09-26T14:46:29.623 回答