在C ++中编辑/ etc / fstab条目

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

我已经findsetmntent()getmntent()来遍历退出的条目,所以我可以很容易地检查在我的configuration文件中是否也存在fstab条目。 然后,我可以使用addmntent()添加任何尚不存在的条目 – 文档中没有提到可以编辑条目的任何内容,只是在文件末尾添加一个新条目。 似乎没有办法编辑现有的条目或删除条目。 看起来很奇怪,这个function不存在,只有CR而不是CRUD的UD。

我宁愿不必写我自己的parsing器,如果我能帮上忙的话。

我的另一种select是:

  • 使用setmntent()打开文件
  • 使用getmentent()将整个fstab读入内存并执行任何添加和/或编辑
  • 使用endmntent()closures文件
  • 打开/etc/fstab进行写入
  • closures/etc/fstab (从而清空文件)
  • 使用setmntent()打开fstab
  • 循环通过我以前读过的条目,并使用addmntent()写出它们

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

修改系统配置文件(如/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()是有原因的 – 因为这会鼓励糟糕的编程/改变系统关键文件的坏方法。 你在帖子的末尾说“…可能很好…” – 不是 。 更改系统配置文件的唯一安全方法是编写一个完整的修改副本,将其同步到安全存储,然后使用重命名来替换旧副本。