我正在尝试使用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/