2016-08-03 20 views
1

は、私は次の引数でshmgetを呼び出すとしますセグメントがすでに存在する場合、shmgetパーミッションビットはどのように使用されますか?

int shmid = shmget(KEY, 1024*4096, IPC_CREAT|0644); 

さらに、キーKEYとのセグメントがすでに存在していることとします。どのようにshmgetshmflg引数(この場合は0644)のパーミッションモードビットORは、shmgetの動作にどのように影響しますか? shmgetは、これらの許可フラグを持つセグメントの権限に許可の確認」のいずれかの種類を実行していますか?具体的にその検証は何を伴うのでしょうか?

答えて

1

をどのように行うshmflg argumentにOR演算パーミッションモードビット[...] shmget

POSIXが既に指定されたキーの共有メモリ・セグメントがある場合のために、この質問に解釈するには少しトリッキーです?shmgetの行動に影響を与えるが、その意図は、それが動作することのようですopen()と同様に、プロセスのuidとg idと要求されたモードがセグメントのuid、gid、およびパーミッションと矛盾する場合、関数は失敗します。具体的には、shmget()関数は次の場合に失敗しなければならない

shmflgの下位9ビットで指定された共有メモリ識別子キーが、操作許可のために存在する[...] [...]付与されないであろう。

shmget()のためのLinuxのmanページは、同様のテキストがあり、また、特に、共有メモリ・セグメントが既に存在する場合

は、権限が[...]確認されていることを述べています。

これはPOSIXと違いはありませんが、もっと明示的です。

Another section of POSIXは、読取り/書込みアクセスが許可されているか拒否されているかどうかを詳細に説明しています。

は、具体的にその検証は何を伴うのでしょうか?これらの許可フラグとセグメントの権限に許可の確認」のいずれかの種類を実行したshmgetしていますか?

はい、上方及びリンクPOSIX仕様で説明したように。

shmflgの下位9ビットで指定された操作許可が何であるかはわかりませんが、呼び出し元のプロセスが作成していた場合にその呼び出し元プロセスが持つ権限を意味すると解釈できますそれは本当に意味すると思うshmflagでオンになっているすべてのモードビットもセグメントの権限フィールドにオンになっています。

関連する問題