gpt4 book ai didi

linux - 获取上次挂载/卸载的文件系统的名称

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:22 24 4
gpt4 key购买 nike

我知道我可以监视(使用 pollselect )文件 /proc/mount/etc/mtab 并查找 WHEN 安装或卸载文件系统。我也可以使用 getmntent用于获取已安装文件系统的列表。

我的应用旨在监控挂载的文件系统并报告任何更改(挂载或卸载)。

我的解决方案:

  1. 检测 /proc/mounts 中的一些变化。
  2. 使用 getmntent 获取所有当前安装的文件系统。
  3. 将获得的列表与之前的列表进行比较。
  4. 处理差异。

但我需要知道在从 /proc/mounts/etc/mtab 轮询时是否有某种方法可以挂载最后一个文件系统。只需读取文件或将数据轮询到某种结构中(例如 mntent。)

最佳答案

方案说明

实现的解决方案涉及udev , poll , setmntentgetmntent .

我们的想法是保留所有已安装文件系统的列表(这不会占用大量内存,因为设备数量通常很少)并且该列表只需创建一次。

“/proc/mounts” 上使用poll(),您可以了解何时 文件系统被挂载或卸载。然后使用 udev 你可以获得当时安装的设备列表。因此,您可以与已有的列表进行比较,这样您就可以知道文件系统是挂载还是卸载,以及哪个文件系统受到影响。

soultion的相关代码示例

获取挂载节点的函数。

vector<string> get_mounted_storage_nodes()
{
vector<string> storage_nodes = get_storage_nodes(); // This uses udev.
vector<string> mounted_nodes;
struct mntent *mntent;

FILE *file;
file = setmntent("/etc/mtab", "r");

while ((mntent = getmntent(file)))
{
string mounted_node(mntent->mnt_fsname);
vector<string>::iterator it;
it = find(storage_nodes.begin(), storage_nodes.end(), mounted_node);
if (it != storage_nodes.end())
mounted_nodes.push_back(mounted_node);
}

return mounted_nodes;
}

判断文件系统是挂载还是卸载

简单的只是比较两个 lits 的大小。

// event is a convenience struct that holds the name of the affected
// filesystem and the action (mounted or unmounted).

vector<string> new_mounted_nodes = get_mounted_storage_nodes();
int new_size = new_mounted_nodes.size();
int curr_size = mounted_nodes.size();

if (new_size == curr_size)
event.action = NONE; // No partition was mount or unmounted.
// This case is very common when the poll
// is working as non-blocking because the timeout.
else
event.action = new_size > curr_size ? MOUNT : UMOUNT;

找出受影响的文件系统

vector<string> new_mounted_nodes = get_mounted_storage_nodes();

使用上一行,如果文件系统已挂载,您只需找到 new_mounted nodes 的元素,该元素不在您已有的已挂载节点列表中。另一方面,如果文件系统被卸载,您必须找到您已有的列表中但不在 new_mounted_nodes 中的元素。

代码示例:

switch(event.action)
{
case MOUNT:

for (auto it = new_mounted_nodes.begin(); it != new_mounted_nodes.end(); ++it)
if (find(mounted_nodes.begin(), mounted_nodes.end(), *it) == mounted_nodes.end())
{
event.node = *it;
break;
}
break;

case UMOUNT:
for (auto it = mounted_nodes.begin(); it != mounted_nodes.end(); ++it)
if (find(new_mounted_nodes.begin(), new_mounted_nodes.end(), *it) == new_mounted_nodes.end())
{
event.node = *it;
break;
}
break;
default:
break;
}

重要提示:最新代码的复杂度是O(n^2),但是挂载设备的数量一般会(我不想absolute) 低于 20。因此,算法将运行得非常快。

关于linux - 获取上次挂载/卸载的文件系统的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23279919/

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