なぜ?

なぜ?

共有オブジェクトを作成したプロセスで共有メモリへの書き込み権限を取り消すことで、書き込み権限を持つ仮想空間に共有メモリをマッピングした他のプロセスが許可されてから実際に書き込みを試みるときに失敗するようにする方法はありますか? ?キャンセルされましたか?

最初はfchmod()、共有メモリー・オブジェクトを使用して書き込み権限を取り消すと、共有メモリー・オブジェクトがマップされた他のshm_open()プロセスPROT_WRITEによるすべての後続の書き込みによってmmap()セグメントが発生すると予想しました。しかし、これは本当ではありません。

今、私が望む動作を達成する別の方法(システムコール、共有メモリAPI..)があるかどうか疑問に思います。

アプリケーションを起動するときは、RDMAを使用するために共有メモリオブジェクトを登録するときに書き込み権限が必要です。しかし、最終的に私はローカルプロセスが共有メモリオブジェクトに書き込めないようにしたいと思います。

答え1

これはLinux特権モデルでは不可能です。あなたが要求したフォームに直接メカニズムがある可能性はほとんどありません。

なぜ?

プロセスがファイルを mmap すると、ファイルへのアクセスは次のように行われます。仮想アドレス指定。個々の読み取り/書き込みは確認されておらず、これはパフォーマンスのためです。これが実際にメモリマッピングの鍵です。いつDMA、メモリマッピングを使用すると、CPUオーバーヘッドがほぼゼロに近いファイルアクセスが可能になります。つまり、ファイルがメモリにマップされた後にページがまだディスクからロードされていない場合、または変更を再度ディスクにフラッシュし始める適切な理由がある場合にのみ、カーネルが参加するだけです。他のすべては仮想アドレス指定によって処理されます。

実際、この問題は思ったよりはるかに深刻です。プロセスがファイルを読み書きできるようにするには、次のようにします。読む()そして書く()いいえ一度ファイルに対する権限があります。必要なのは開放型FD(ファイル記述子)。ファイル権限通常プロセスをブロックするとこれを達成できますが、完全にブロックするわけではありません。 FDは、unix-domain-socketを使用してプロセス間で渡すことができます。したがって、権限のあるプロセスは、開いているFDを権限なしで他のプロセスに渡すことができます。

解決策

あなたの質問は完全にはっきりしていません。アプリケーションには読み取り専用アクセスが必要で、他の項目にはRDMAを介した読み取り/書き込みアクセスが必要だと思います。

このような場合は、ファイルを2回メモリにマッピングすることをお勧めします。一度は書き込み権限があり、一度は書き込み権限がありません。あるメモリマップへの変更は、設定している限り他のメモリマップに伝播されますMAP_SHARED

RDMAが動作しているプロセスで書き込みアクセスを開いたままにする必要がある場合は、いつでも次のことができます。クロス()、あるプロセスでは書き込みアクセス権を維持し、もう一方のプロセス(アプリケーション)では読み取り専用アクセス権を維持します。あなたの質問でこれが必要かどうかはわかりません。

関連情報