在procfs文件上选择功能

时间:2011-12-15 22:54:37

标签: c linux

我正在为这类问题寻找解决方案。我想用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文件中有任何更改,我该如何收到通知?

2 个答案:

答案 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,因为它在可配置的内核对象上运行,作为自己的文件描述符暴露给用户空间。

Example of using epoll