我正在为这类问题寻找解决方案。我想用select
来监控procfs文件的更改(我想使用select
,而不是i_notify
,因为我看了一个套接字的另一个描述符。)
我尝试过这样的事情:
fd1 = open("/proc/my_file", O_RDONLY, 0);
FD_ZERO(&rfds);
FD_SET(fd1, &rfds);
tv.tv_sec = 500;
tv.tv_usec = 0;
retval = select(fd1+1, &rfds, NULL, NULL, &tv);
这是错误的,因为文件随时可以读取。
如果select
文件中有任何更改,我该如何收到通知?
答案 0 :(得分:4)
select(2)
不报告“更改”,而是“准备阅读”。来自OpenGroup select()
manpage:
与常规文件关联的文件描述符始终选择为true,以便于读取,准备写入和错误条件。
内核提供的文件有点奇怪 - 它们不是“常规文件” - 但select(2)
不是确定这些文件中更改的工具。
如果要发现更改,则必须使用inotify(7)
。虽然如果procfs(5)
中的所有文件都不使用这种机制,我真的不会感到惊讶 - 当基础数据发生变化时,很多人可能不会知道。考虑/proc/loadavg
- 它可能会在您每次阅读时都发生变化,但没有必要通过inotify(7)
显示这些变更。
答案 1 :(得分:0)
如果您想知道文件描述符是否有任何更改,可以使用库libevent
。
libevent是一个异步事件通知软件库。 libevent API提供了一种执行回调函数的机制 特定事件发生在文件描述符上或超时后 已达成。此外,libevent还支持回调 信号或定期超时。
目前,libevent支持/ dev / poll,kqueue(2),select(2),poll(2), epoll(4)和Solaris的事件端口
或者您也可以使用epoll
。
epoll是Linux的可扩展I / O事件通知机制,首先在Linux 2.5.44 1中引入。它旨在取代旧的POSIX select(2)和poll(2)系统调用,以便在要求更高的应用程序中实现更好的性能,在这些应用程序中,监视文件描述符的数量很大(与在O处运行的旧系统调用不同) n),epoll在O(1)[2]中运行。 epoll类似于FreeBSD的kqueue,因为它在可配置的内核对象上运行,作为自己的文件描述符暴露给用户空间。