通过/ proc / mounts监视挂载点更改

根据PROC手册,可以监控用于通过开口安装点的变化在linux系统“的/ proc

/安装”,以及将所述的文件描述符读取fd_setselect()呼叫。

以下代码可在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调用中会不断弹出。即使坐骑没有变化。

我在这里想念什么吗?

在此先感谢您的帮助!

男子5进程:

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

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

2)和epoll_wait(2)将文件标记为有错误情况。

回答:

linux内核中有一个错误修复描述了这种行为:

SUSv3说“常规文件应始终对TRUE进行读写”。参见

http://www.opengroup.org/onlinepubs/009695399/functions/poll.html

因此,您必须在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);

}

}

以上是 通过/ proc / mounts监视挂载点更改 的全部内容, 来源链接: utcz.com/qa/433289.html

回到顶部