gpt4 book ai didi

c - 通过/proc/mounts 监控挂载点变化

转载 作者:IT王子 更新时间:2023-10-29 00:05:01 26 4
gpt4 key购买 nike

根据proc手册,可以通过打开“/proc/mounts”,并在select()调用。

以下代码适用于 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 起)

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

最佳答案

有一个bugfix在描述该行为的 linux 内核中:

SUSv3 says "Regular files shall always poll TRUE for reading and writing". see http://www.opengroup.org/onlinepubs/009695399/functions/poll.html

因此,您必须将轮询与 POLLPRI | 结合使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com