まず最初に、この質問の動機づけを提供するための少しの背景情報:ヘッドレスLinuxサーバ上で実行され、それぞれext4ファイルシステムでフォーマットされた複数のリムーバブル外部ハードドライブ上のファイルを読み書きするプログラムがあります。非常に時々、これらのドライブの1つのファイルシステムのメタデータが何らかの理由で(ext4ジャーナリングにもかかわらず)壊れてしまい、ext4ファイルシステムドライブが問題を検出し、そのパーティションを読み取り専用として再マウントする可能性があります。ドライブはさらに進みます。マウントされたファイルシステムが読み取り専用かどうかを調べるためのLinux C API呼び出しはありますか?
よろしいですか。私が今したいのは、ドライブがこの再マウントされた読み取り専用状態にあることを検出できる機能をプログラムに追加することです。これにより、ドライブが問題になっていることをユーザーにプロアクティブに通知できます。
私の質問は、読み込み専用でマウントされているかどうかを調べるために、ファイルシステムを照会するためのエレガントで/サポートされている方法は何ですか?
ファイルシステムにファイルを書き込もうとすると、他の理由で失敗する可能性があります。また、ファイルシステムに書き込む必要がないため、ファイルシステムに書き込む必要がないためです。
私のプログラムはfopen("/proc/mounts", "r")
で、それが生成するテキスト行(私のパーティションに対応する行の "rw"トークンのためのグロッピング)を解析することができます。私はそうしなければなりませんが、 (あまりにもスクリーンスクレイピングに似ていて、テキスト形式が変わっても壊れやすい)。
Linuxシステムコールを軽量で目的に合わせて使用すると、特定のファイルシステムマウントポイント(「/ dev/sda1」など)が現在読み取り専用でマウントされているかどうかを知ることができますか? stat()
のように見えるかもしれませんが、どうやって見ることができません。
['statvfs()'または 'fstatvfs()'](http://man7.org/linux/man-pages/man3/statvfs.3.html)でもこれを行うPOSIX.1関数があります。 )を任意のファイルに作成します。 '.f_flag&ST_RDONLY'は、読み取り専用でマウントされます。 –
愚かな解決策は、['access()'](https://linux.die.net/man/2/access)を使うことです。 – Stargateur
_サイドノート:_ 'statvfs'のマニュアルページを見ると[as Nominal Animalが提案したように、 'statvfs'の_older_バージョンは'/proc/mounts'を解析してフラグを集めたので注意してください。マニュアルページでは、 'statvfs'がLinuxのシステムコール' statfs'を呼び出してこの情報を取得するようになっています。 –