2

/etc/fstabC++ を使用して CentOS インストールでファイルを編集しようとしています。別の構成ファイルに基づいて、fstabに存在しないエントリを追加するか、マウントポイントが同じfstabファイルのエントリを編集するという考えです。これにより、最初の起動時にシステムを適切にセットアップできます。

setmntent()fstab のエントリが構成ファイルにも存在するかどうかを簡単に確認できるように、既存のエントリをgetmntent()繰り返し処理することを見つけました。そして、addmntent()まだ存在しないエントリを追加するために使用できます。ドキュメントには、エントリを編集できることについては何も記載されておらず、ファイルの最後に新しいエントリを追加するだけです。既存のエントリを編集したり、エントリを削除したりする方法はないようです。この機能が存在せず、CR のみで CRUD の UD が存在しないのは奇妙に思えます。

できることなら、自分でパーサーを書く必要はありません。

私の他の選択肢は次のとおりです。

  • を使用してファイルを開きますsetmntent()
  • を使用して fstab 全体をメモリに読み込み、getmentent()追加や編集を実行します
  • を使用してファイルを閉じますendmntent()
  • 書き込み/etc/fstab可能
  • 閉じる/etc/fstab(ファイルを空にする)
  • を使用してfstabを開きますsetmntent()
  • 以前に読み込んだエントリをループし、それらを使用して書き出す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 に答える