【问题标题】:Editing an /etc/fstab entry in C++在 C++ 中编辑 /etc/fstab 条目
【发布时间】:2011-05-21 12:28:57
【问题描述】:

我正在尝试使用 C++ 在 CentOS 安装上编辑 /etc/fstab 文件。这个想法是基于另一个配置文件,我将添加 fstab 中不存在的条目,或者在挂载点相同的 fstab 文件中编辑条目。这让我们可以在初始启动时正确设置系统。

我发现 setmntent()getmntent() 用于迭代现有条目,因此我可以轻松检查 fstab 中的条目是否也存在于我的配置文件中。然后我可以使用addmntent() 添加任何不存在的条目 - 文档没有说明能够编辑条目,只在文件末尾添加一个新条目。似乎无法编辑现有条目或删除条目。奇怪的是,这个功能不存在,只有CR而不是CRUD的UD。

如果我能提供帮助,我宁愿不必编写自己的解析器。

我的另一种选择是:

  • 使用setmntent()打开文件
  • 使用 getmentent() 将整个 fstab 读入内存并执行任何添加和/或编辑
  • 使用endmntent()关闭文件
  • 打开/etc/fstab写作
  • 关闭/etc/fstab(从而清空文件)
  • 使用setmntent()打开fstab
  • 循环浏览我之前读入的条目并使用addmntent() 将它们写出来

虽然可能很好,但看起来有点乱。

【问题讨论】:

  • 将当前文件移动到备份而不是截断。

标签: c++ linux filesystems mount


【解决方案1】:

在修改/etc/fstab 等系统配置文件时,请记住这些是关键状态,如果您的“编辑”因断电而中断,可能会导致无法重新启动。
处理方法是:

  1. 创建一个空输出:
    FILE* out = setmntent("/etc/fstab.new", "rw");
  2. 打开原文供输入:
    FILE* in = setmntent("/etc/fstab", "r");
  3. 复制内容:
    while (m = getmntent(in)) { addmntent(out, m); }
  4. 确保输出包含所有内容:
    fflush(out); endmntent(out); endmntent(in);
  5. 原子替换/etc/fstab:
    rename("/etc/fstab.new", "/etc/fstab");

留给读者作为练习来更改 while 循环的主体以对现有元素进行修改,以替换专门设计的 mntent 或其他任何内容。如果您对此有具体问题,请提出。

rename() 的 UN*X 语义保证即使在断电的情况下,您也将拥有原始版本或新的更新版本。

没有modifymntent() 是有原因的——因为这会鼓励不良编程/更改系统关键文件的不良方式。你在帖子的结尾说“......可能很好......” - 不是。更改系统配置文件的唯一安全方法是编写完整的修改副本,将其同步到安全存储,然后使用重命名替换旧的。

【讨论】:

  • 这就是我打算做的,我只是为了说明这一点而保持简单。我认为没有modifymntent() 会鼓励不良的做事方​​式,因为人们会编写自己的解析器做你刚刚警告过的事情。在那里拥有可以为您完成所有这些功能的功能要好得多。
  • 最初的问题表明您计划实际 /etc/fstab。如前所述,这是要避免的关键步骤。编写一个 new 文件。正如您所说,*mntent() 函数仅可用于纯输入/仅输出。这就是我一直试图说明的:这是设计/意图!因此使用两个文件 - 从/etc/fstab 读取,写入/etc/fstab.new,完成后刷新并重命名。在 C++ 语言中,您可以将 getmntent() 称为 const 前向输入迭代器,将 addmntent() 称为前向输出迭代器。注意:既不是随机的也不是双向的。
  • 如果你从迭代器特征的角度来看它,那么很明显,一个 const 前向输入迭代器意味着你不能修改你通过它迭代的文件。对于上述模式,输入和输出不能是同一个文件。
  • 抱歉给您带来了困惑,当我说 write 时,我的意思是最终目标是拥有一个新的 fstab。我知道它是专为输入/输出而设计的。我仍然认为没有修改函数并将其方式留给程序员去做任何旧垃圾,而不是将您建议的所有内容封装在一个简单的函数调用中是一件坏事。
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多