linux,inotify - 如何订阅?
Posted
技术标签:
【中文标题】linux,inotify - 如何订阅?【英文标题】:linux, inotify - how to subscribe? 【发布时间】:2010-11-01 07:58:31 【问题描述】:你能解释一下inotify机制吗? 我在网上搜索过它,但我的理解是,如果我想查看文件中的更改,我必须使用“读取”功能进行轮询。 是否有任何回调函数会在文件发生更改而不进行轮询时通知我?
谢谢,
【问题讨论】:
【参考方案1】:我推测您正在使用一些为您处理事件的 GUI 库。
更好的 GUI 库有一种观察文件描述符的方法。在 GTK 中为gtk_input_add_full;在 Qt 中,QSocketNotifier 可能对你有用。
【讨论】:
为你修复了链接,多一点代表,你自己添加它们没有问题。【参考方案2】:inotify 调用使用文件描述符。您可以在 select() 调用系列中使用返回的 FD,而不是轮询。它不完全是一个回调函数,但减少了您所关心的开销。
【讨论】:
【参考方案3】:您可以使用 libev 库的 ev_io 部分。这将允许您在 inotify fd 可读时设置回调。
libev 的文档可以在这里找到:http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod
【讨论】:
【参考方案4】:不,inotify 需要轮询。
使用信号注册回调(如建议的那样),IMO 比定期轮询更糟糕。
【讨论】:
适当指出,但您能详细说明为什么会更糟吗? :) @Frédéric Hamidi 信号的一个问题是它们不能很好地与异常混合。第二个问题是信号处理程序应该做尽可能少的工作,然后返回。 仅当您通过信号处理程序的异常时。信号处理程序应该做尽可能少的工作这一事实并不意味着轮询是首选。例如,您的主代码可以创建一个管道,设置信号处理程序,然后在管道上进行选择。信号处理程序将单个字符写入管道然后退出。 write 是异步信号安全的。控制返回到您的主代码并选择返回。你有一个最小的信号处理程序,不需要轮询。以上是关于linux,inotify - 如何订阅?的主要内容,如果未能解决你的问题,请参考以下文章