当前位置: 首页 > 面试题库 >

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

荀增
2023-03-14
问题内容

根据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);
          }
     }


 类似资料:
  • 我有一个在容器中运行的web应用程序。该应用程序允许用户上传文件。这些文件存储在Docker卷和中。 做这件事的适当方法是什么? Docker-compose.yml

  • 问题内容: 我试图通过数据库链接调用存储过程。代码看起来像这样: 当我从package_name所属的相同数据库实例和模式运行此程序时,我可以很好地运行它。但是,当我通过数据库链接运行它((对存储的过程名称进行必要的修改等)时,我得到一个oracle错误:ORA-24338:语句句柄未执行。 此代码在dblink上的修改后的版本如下所示: 问题答案: 关于另一个问题,我记得package_name

  • 我们有多个基于Web逻辑和Tomcat的应用程序。对于这些具有不同垃圾收集格式的不同java应用程序,获得用于监视堆问题、占用线程等的“标准”方法的典型解决方案是什么。 通常我想做的是从这些应用程序中获取最后一次完全垃圾收集和常规垃圾收集条目,并从它们中获取初始最大值。进行计算,将数据保存到进行报告,并在达到阈值时生成警报。 最好的方法是什么? 谢谢博帕利

  • 问题内容: 我有一个Java应用程序连接到远程Oracle数据库上的视图。 有谁知道Java中监视此表更改的方法吗?即,如果有更新的插入等,我需要做出反应。 问题答案: 您可以在表上放置INSERT / UPDATE / DELETE触发器,以在对表进行“数据”更改时执行某些操作。(而不是更改表的结构) 我相信10g也支持视图触发器。 但是我不确定您如何通过轮询来通知其他Java进程。 抱歉。 您

  • 我正在做一个项目,需要在一个基于OSGi的应用程序中使用预编程的指令来监视和管理(启动、停止、安装、卸载、更新)OSGi包,类似于java反射,OSGi应用程序可以通过监视自身及其上下文来对自身进行反思,它可以更新或删除某个包,或者可以添加(安装和启动)一个新的包。 例如,有一个使用OSGi捆绑开发的聊天应用程序。为了给它添加自我管理特性,需要有一种机制来自主地监控和管理(安装/卸载、启动/停止、

  • 所以我知道docker正在使用/var/lib/docker/存储每个容器和图像。。。正当 这意味着我能对我的容器做的唯一优化是优化 /var/lib/docker/坐在上面的底层fs? 在这个意义上,我是否可以假设我应该优化我的底层系统fs的挂载选项?例如ext4 noatime,noadirtime等 另外,我可以使用不同的挂载/var/lib/docker/folder吗??底层磁盘dock