2016-08-03 23 views
1

想我打電話shmget使用以下參數:段已經存在時,如何使用shmget權限位?

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

,並進一步,假設與關鍵KEY段已經存在。 shmget的參數shmflg參數(在這種情況下,0644)的許可模式位OR'd如何影響shmget的行爲?是否shmget與這些權限標誌段的權限執行任何種類的「權限驗證?具體是什麼驗證意味着什麼?

回答

1

如何進行或運算到shmflg argument的權限模式位[...]的shmget影響shmget的行爲?

POSIX是有點棘手解釋這個問題對於那些已經有指定鍵共享內存段的情況,但目的似乎是它的運作類似於open()。也就是說,如果進程的uid和g id和請求的模式與段的uid,gid和權限不一致,則該功能失敗。具體地,如果

shmget()功能必須失敗:[...]的共享存儲器的標識符存在的shmflg 9個比特將不會被授予由低階指定的鍵,但操作許可[...] 。

Linux聯機幫助頁shmget()也有類似的文字,還特意說,

如果共享內存段已經存在,權限驗證[...]。

這與POSIX沒有什麼不同,只是更加明確。

Another section of POSIX給出了更多的細節,這些細節歸結爲說讀/寫訪問是基於根據它的euid和egid適用於進程的許可位集來授予或拒絕的。

是否shmget的與這些權限標誌段的權限執行任何種類的「權限驗證?具體是什麼驗證意味着什麼?

是,以上和鏈接POSIX規格說明

對於我來說,我還有點不清楚「shmflg的低9位指定的操作權限」是什麼,我們可以將它解釋爲調用進程在創建段的權限它,但我認爲這確實意味着什麼只是在shmflag中打開的所有模式位也都在段的權限字段中。

相關問題