什么是在POSIX环境中实现全局可签名事件的良好可移植方式

时间:2010-12-01 15:55:15

标签: events posix posix-api

用例是一个应用程序生成一个事件并发出一个信号,表明任何关心它的应用程序都会得到它。例如。应用程序更新文件的内容并发出信号。在Linux上,这可以由服务员在文件上调用inotify来完成。一种可移植的方式是让听众注册一个着名的服务器,但我希望如果可能的话更简单。尽可能便携,理想情况下意味着只使用广泛可用的POSIX功能。

2 个答案:

答案 0 :(得分:1)

使用锁定文件的选项

您可以通过锁定文件来完成此操作。

信号发射器初始设置:

  • 创建一个具有已知名称的文件并将其锁定以便写入(fcntl(F_SETLK)F_WRLCK或flock(LOCK_EX)`。)。

信号接收程序:

  • 使用众所周知的文件名打开文件并尝试获取一个读锁定(fcntl(F_SETLK) F_RDLCKflock(LOCK_SH))。
  • 接收器阻塞,因为发射器存在冲突的写锁定。

信号发射:

  • 信号发射器创建一个新的临时文件
  • 信号发射器在新临时文件上获得写锁定
  • 信号发射器将新临时文件重命名为众所周知的文件名。这会破坏旧的锁定文件,但等待的接收者都会保留对它的引用。
  • 信号发射器关闭旧锁定文件。这也释放了锁。
  • 信号接收器全部唤醒,因为现在他们可以获得读锁定。
  • 信号接收器应该关闭他们刚刚获得锁定的文件。它不会再被使用。如果他们想等待条件再次发生,他们应该重新打开文件。

在信号发射器中,已在原始锁定文件顶部重命名的临时锁定文件现在变为新的当前锁定文件。

使用网络组播的选项

让接收者加入组播组并等待数据包。让信号发射器将UDP数据包发送到该多播组。

如果您希望仅使用主机本地通信,则可以将发送和接收UDP套接字绑定到环回接口。

答案 1 :(得分:0)

最后我使用了绑定的unix域套接字。所有者保留一组客户端FD,并在发生事件时向每个FD发送消息。