2015-10-20 18 views
1

我知道當我創建一個共享內存塊時,我們設置權限,以便每個進程都可以在該塊中讀寫0777(不知道爲什麼,我的老師只是說這樣使用它)。System V共享內存權限位:含義以及如何更改

我創建與shmget的爲:

shmget(IPC_PRIVATE, sizeof(server_config), IPC_CREAT|0777) 

不過,我想知道:

  • 什麼每個數字意味着

  • 後如何更改標誌共享內存塊被創建

  • 如何僅允許1個過程s到寫,而所有其他proccesses只能讀

+1

請詳細說明如何創建共享內存塊;答案取決於您是否將舊的System V API用於共享內存,較新的POSIX API或其他內容。 (「0777」非常強烈地暗示這是Unixy,*不是* Windows,但如果我錯了,請這麼說。) – zwol

+0

@zowl很明顯,就像我在學習現代物理時一樣,我的老師說Schroedinger Equaition的H原子解決方案的分離常數應該保持原樣,我根本不開心,並且解決方程來理解爲什麼? –

+0

是的,這正是我們需要知道的,謝謝。('shmget'是「舊的System V API」的一部分。) – zwol

回答

2

它的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。從模式位的解釋中應該清楚爲什麼這會產生所需的效果。

+0

太糟糕了,無法接受兩個答案。但是如果你不介意的話,我有一個解決方案。你怎麼看? –

+0

@zwol我假設第二部分意味着創建它的那個是可以寫的? 另外,你可以測試它嗎?我會說buf.perm會是buf.shm_perm,但我不確定,因爲我從來沒有聽說過shmctl –

+0

@iharob我們可以換個方式來做,也許吧?你需要比我更多的虛擬互聯網點;-) – zwol