根据proc手册,可以通过打开“/proc/mounts”并添加文件描述符以在fd_set调用中读取select()来监视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);
    }
}

Compilable snippet.

文件描述符始终在一台机器上可读,因此在select调用中会不断弹出。即使坐骑也没有变化。

我在这里想念什么吗?

在此先感谢您的帮助!

man 5 proc:

/proc/[pid]/mounts(从Linux 2.4.19开始)

这是当前在进程的安装 namespace 中安装的所有文件系统的列表。该文件的格式记录在fstab(5)中。从内核版本2.6.15开始,此文件是可轮询的:打开文件进行读取后,此文件中的更改(即文件系统已挂载或卸载)会导致select(2)将文件描述符标记为可读,并且poll( 2)和epoll_wait(2)将文件标记为有错误情况。

最佳答案

在Linux内核中有一个bugfix描述了这种行为:



因此,您必须在POLLPRI中使用poll。 POLLERR标志。像这样的东西:
int mfd = open("/proc/mounts", O_RDONLY, 0); struct pollfd pfd; int rv; int changes = 0; pfd.fd = mfd; pfd.events = POLLERR | POLLPRI; pfd.revents = 0; while ((rv = poll(&pfd, 1, 5)) >= 0) { if (pfd.revents & POLLERR) { fprintf(stdout, "Mount points changed. %d.\n", changes++); } pfd.revents = 0; if (changes > 10) { exit(EXIT_FAILURE); } }

关于c - 通过/proc/mounts监视挂载点更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5070801/

10-10 18:19