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

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

如果我完全可以帮助的话,我宁愿不必编写自己的解析器。

我的另一种选择是:

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

    尽管可能很好,但看起来有点困惑。

    最佳答案

    修改诸如/etc/fstab之类的系统配置文件时,请记住,它们是关键状态,如果您的“编辑”被断电而中断,则可能导致重新启动失败。
    解决这个问题的方法是:

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

  • 留给读者的练习是,更改while循环的主体以对现有元素进行修改,以替代特制的mntent或其他内容。如果您对此有特定疑问,请询问。
    rename()的UN * X语义保证即使在断电的情况下,您也将拥有原始版本或新的更新版本。

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

    关于c++ - 在C++中编辑/etc/fstab条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4375790/

    10-10 13:32