2

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

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

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

我的另一个选择是:

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

虽然可能很好,但似乎有点混乱。

4

1 回答 1

5

在修改系统配置文件时,/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或其他内容。如果您对此有具体问题,请询问。

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

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

于 2010-12-07T11:39:24.373 回答