【发布时间】:2011-07-01 13:04:53
【问题描述】:
根据proc手册,可以通过打开“/proc/mounts”,在select()调用中添加要读取fd_set的文件描述符来监控linux系统中挂载点的变化。
以下代码适用于 Ubuntu 9.04,而不适用于 Ubuntu 10.04(带有 2.6.32 linux 内核):
int mfd = open("/proc/mounts", O_RDONLY, 0);
fd_set rfds;
struct timeval tv;
int rv;
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
int changes = 0;
while ((rv = select(mfd+1, &rfds, NULL, NULL, &tv)) >= 0) {
if (FD_ISSET(mfd, &rfds)) {
fprintf(stdout, "Mount points changed. %d.\n", changes++);
}
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
if (changes > 10) {
exit(EXIT_FAILURE);
}
}
文件描述符在一台机器上总是可读的,因此它会在 select 调用中不断弹出。即使坐骑没有变化。
我错过了什么吗?
提前感谢您的帮助!
/proc/[pid]/mounts(Linux 2.4.19 起)
这是当前挂载在进程挂载命名空间中的所有文件系统的列表。该文件的格式记录在 fstab(5) 中。从内核版本 2.6.15 开始,该文件是可轮询的:打开文件进行读取后,该文件的更改(即文件系统挂载或卸载)导致 select(2) 将文件描述符标记为可读,并且 poll( 2) 和 epoll_wait(2) 将文件标记为有错误条件。
【问题讨论】:
-
故障机器上的 strace 输出。 gist.github.com/837605#gistcomment-21716
标签: c linux filesystems mount procfs