在POSIX环境中实现全局信号事件的一种好方法是什么
题
使用情况是,一个应用程序会生成事件,并发出一个信号,任何关心聆听的应用程序都会得到。例如,应用程序更新文件的内容并发出信号。在Linux上,这可以由呼叫文件上的服务员来完成。一种便携式方法是让听众向知名服务器注册,但是如果可能的话,我更喜欢一些简单的东西。理想情况下尽可能便携,意味着仅使用POSIX功能,这些功能也可以广泛使用。
解决方案
使用锁定文件的选项
您可以通过锁定文件来做到这一点。
信号发射器初始设置:
- 创建一个具有众所周知名称的文件,然后锁定它以供写(
fcntl(F_SETLK)
和F_WRLCK
或羊群(lock_ex)`)。
信号接收器程序:
- 使用众所周知的文件名打开文件,并尝试在其上获取读取锁(
fcntl(F_SETLK)
和F_RDLCK
或者flock(LOCK_SH)
). - 接收器块是因为发射极持有冲突的写锁。
信号发射:
- 信号发射器创建一个新的临时文件
- 信号发射器在新的临时文件上获得写锁
- 信号发射器将新的临时文件重命名为众所周知的文件名。这将固定旧的锁定文件,但等待的接收器都保留了对其的参考。
- 信号发射器关闭旧锁定文件。这也释放了锁。
- 信号接收器全部醒来,因为现在他们可以获得读取锁。
- 信号接收器应关闭他们刚刚锁定的文件。它不会再次使用。如果他们想等待再次发生条件,则应重新打开文件。
在信号发射极中,已在原始锁定文件顶部重命名的临时锁定文件现在成为新的当前锁定文件。
使用网络多播的选项
让接收器加入一个多播组并等待数据包。让信号发射器将UDP数据包发送到该多播组。
如果您希望仅使用主机 - 本地通信,则可以将发送和接收UDP插座绑定到环回接口。
其他提示
最后,我使用了一个绑定的Unix域插座。所有者保留一系列客户端FD,并在发生事件时发送消息。
不隶属于 StackOverflow