我知道當我創建一個共享內存塊時,我們設置權限,以便每個進程都可以在該塊中讀寫0777(不知道爲什麼,我的老師只是說這樣使用它)。System V共享內存權限位:含義以及如何更改
我創建與shmget的爲:
shmget(IPC_PRIVATE, sizeof(server_config), IPC_CREAT|0777)
不過,我想知道:
什麼每個數字意味着
後如何更改標誌共享內存塊被創建
如何僅允許1個過程s到寫,而所有其他proccesses只能讀
我知道當我創建一個共享內存塊時,我們設置權限,以便每個進程都可以在該塊中讀寫0777(不知道爲什麼,我的老師只是說這樣使用它)。System V共享內存權限位:含義以及如何更改
我創建與shmget的爲:
shmget(IPC_PRIVATE, sizeof(server_config), IPC_CREAT|0777)
不過,我想知道:
什麼每個數字意味着
後如何更改標誌共享內存塊被創建
如何僅允許1個過程s到寫,而所有其他proccesses只能讀
它的OR
編輯選項,您使用目錄的權限相同的那些八進制數。
這是它們的含義(source)
rwx rwx rwx = 111 111 111
rw- rw- rw- = 110 110 110
rwx --- --- = 111 000 000
and so on...
rwx = 111 in binary = 7
rw- = 110 in binary = 6
r-x = 101 in binary = 5
r-- = 100 in binary = 4
這裏當然,r
代表閱讀和w
爲寫然後x
手段執行。
也有使用這些值定義的常量(見男子open(2)
)
S_IRWXU 00700 user (file owner) has read, write and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
正如你可以看到0777
擁有國內領先的0
因爲它的八進制,相當於S_IRWXU | S_IRWXG | S_IRWXO
。
要回答你的另外兩個問題:
您可以shmctl
更改共享內存塊的權限。它是這樣的 - 沒有經過充分測試,可能是車:
int change_shm_perm(int shmid, mode_t new_permissions)
{
struct shmid_ds buf;
if (shmctl(shmid, IPC_STAT, &buf)) {
perror("shmctl(IPC_STAT)");
return -1;
}
buf.shm_perm = (buf.shm_perm & ~0777) | (new_permissions & 0777);
if (shmctl(shmid, IPC_SET, &buf)) {
perror("shmctl(IPC_SET)");
return -1;
}
return 0;
}
要只允許一個過程來寫,而所有其他人只能讀,與寫權限的進程必須根據自己的UID運行。然後你有這個過程創建內存段並將其權限設置爲0644
。從模式位的解釋中應該清楚爲什麼這會產生所需的效果。
太糟糕了,無法接受兩個答案。但是如果你不介意的話,我有一個解決方案。你怎麼看? –
@zwol我假設第二部分意味着創建它的那個是可以寫的? 另外,你可以測試它嗎?我會說buf.perm會是buf.shm_perm,但我不確定,因爲我從來沒有聽說過shmctl –
@iharob我們可以換個方式來做,也許吧?你需要比我更多的虛擬互聯網點;-) – zwol
請詳細說明如何創建共享內存塊;答案取決於您是否將舊的System V API用於共享內存,較新的POSIX API或其他內容。 (「0777」非常強烈地暗示這是Unixy,*不是* Windows,但如果我錯了,請這麼說。) – zwol
@zowl很明顯,就像我在學習現代物理時一樣,我的老師說Schroedinger Equaition的H原子解決方案的分離常數應該保持原樣,我根本不開心,並且解決方程來理解爲什麼? –
是的,這正是我們需要知道的,謝謝。('shmget'是「舊的System V API」的一部分。) – zwol