Events 在POSIX环境中实现全局可发信号事件的好的可移植方式是什么

Events 在POSIX环境中实现全局可发信号事件的好的可移植方式是什么,events,posix,posix-api,Events,Posix,Posix Api,使用情况是,一个应用程序生成一个事件并发送一个信号,任何关心侦听它的应用程序都会收到该信号。例如,应用程序更新文件内容并发出信号。在Linux上,这可以由服务员在文件上调用inotify来完成。一种可移植的方法是让监听器向知名服务器注册,但如果可能的话,我更喜欢更简单的方法。理想情况下,尽可能便携意味着只使用POSIX功能,这些功能也广泛可用。选项使用锁定文件 您可以通过锁定文件来实现这一点 信号发射器初始设置: 使用已知名称创建一个文件,并将其锁定以进行写入(fcntl(F_SETLK)wi

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

选项使用锁定文件 您可以通过锁定文件来实现这一点

信号发射器初始设置:

  • 使用已知名称创建一个文件,并将其锁定以进行写入(
    fcntl(F_SETLK)
    with
    F_WRLCK
    或flock(lock_EX)`)
信号接收器程序:

  • 使用已知的文件名打开文件,并尝试获取该文件的读锁(
    fcntl(F_SETLK)
    with
    F_RDLCK
    flock(lock_SH)
  • 接收器阻塞,因为发射器持有冲突的写锁
信号发射:

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

使用网络多播的选项 让接收者加入多播组并等待数据包。让信号发射器向该多播组发送UDP数据包


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

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