O_WRONLYフラグがあるが書き込み権限を持たないファイルを開きます。

O_WRONLYフラグがあるが書き込み権限を持たないファイルを開きます。

フラグはありますが、モード(つまりなし)を持つファイルを使用してから、ファイルopen(...)にデータを書き込んで閉じることができることがわかりました。O_CREAT|O_WRONLY0400w

これは私に少し矛盾していますが、それがどのように機能するのか理解できます。

しかし、最近、CIFSマウントファイルシステムでこのアプローチに問題が発生しました。

今、次の2つのステートメントのどちらが正しいか疑問に思います。

  • 技術的に(POSIX)これは、一部のファイルシステムで機能する「サポートされていない、または文書化されていない」機能です。

または

  • CIFSでは動作しないという事実は、CIFS実装方式の欠点です。

権威ある答えを探していましたが見つかりませんでした。公式のPOSIX規格を参照するのが良いでしょう。

ベストアンサー1

O_CREAT | O_WRONLYフラグを使用してファイルを開くことができますが(...)、0400モードを使用すると(つまり、wなしで)ファイルにデータを書き込んで閉じることができることがわかりました。

これは特権ビットの変更方法と一致します。いいえ開いたファイル記述子へのアクセスに影響します。概念的には、権限のあるファイルを作成して0600から書き込み専用モードで開き、権限をに変更することを想像できます0400。システムは、他のプロセスが中間書き込み用にシステムを開くことを許可するのではなく、これらすべてを原子的に実行します。

見えないopen()システムコールの説明O_WRONLY明示的にこれを行うことができますが、オープンfdが取得する権限とは異なる権限を制御する方法に暗黙的なものがあると思います。モデルパラメーターは、生成されたファイルに設定された許可ビットを制御します。 2つの異なるものとそれいいえ何らかの形で関連性がなければならないとしましょう。

また、EACCESの説明は次のとおりです。

[EACCES] パスプレフィックスのコンポーネントに対する検索権限が拒否されました。またはファイルが存在し、権限が割り当てられています。超過分拒否される、またはファイルが存在せずに作成されるファイルの親ディレクトリに対する書き込み権限が拒否されたか、O_TRUNCが指定されて書き込み権限が拒否されました。

つまり、許可ビットは、すでに存在するファイルにのみ適用されます。しかし、リストされている標準エラー条件が唯一のエラー条件である可能性があると仮定することがどの程度正当であるかは不明です。

CIFSは他の伝統に由来していたので、これが「伝統的な」UnixyファイルシステムやPOSIX仕様とは異なる唯一の点ではないと思います。

おすすめ記事