2012-08-27 15 views
6

我正在使用shmget在Linux上的項目進程之間共享數據。在shmget中用作密鑰的安全值

int shmget(key_t key, size_t size, int shmflg); 

然而,任何其他程序所調用到的shmget太多,因此可能導致按鍵衝突(因爲我用常量作爲鍵調用shmget的,我必須使用而不是生成的關鍵,因爲一個常數橫向流程是獨立構建和運行的)。

在shmget中應該使用哪些安全值作爲密鑰?

回答

5

我建議你使用POSIX shm_open(與mmap)代替,它沒有,只要你沒有使用相同的命名區域其他軟件與ftok存在衝突的問題。

6

沒有安全值,您(和其他每個創建共享段的進程)應該使用IPC_EXCL來確保沒有碰撞。但是,後者應該確保其他程序不會開始寫入您的段(除非寫得很糟糕)。

你可以嘗試建立你的'私人'鍵常量關閉ftok()但是,你知道這是不安全的。如果你碰到什麼東西,你就沒有辦法告訴你的程序這不是正確的關鍵。還請記住:

只有id的低位8位是重要的。如果這些位爲0,則不指定ftok()的行爲。

換句話說,不要在那裏通過0;)。

無論如何,你應該認真考慮創建一些溝通渠道。由服務器用id編寫的單個文件就足夠了,然後其他程序將讀取該文件。

從其他想法,你可以嘗試傳遞服務器PID爲id,如果其他進程可以得到至少。這可能會使它更安全一些。

+0

我正在考慮生成隨機密鑰,並重復創建帶有IPC_EXCL標誌的shm段,直到找到可接受的密鑰,但我不知道它是否是一個好選擇 – jondinham

+1

@PaulDinh:是的,這是一個不錯的選擇。那麼,但你必須有一種方法來生成隨機密鑰,而不依賴於特定的'sizeof(key_t)';那麼我只是使用隨機的'id'作爲ftok()。 –

+0

如果您有一個客戶端 - 服務器方案,其中每個客戶端維護一個共享內存段以便與服務器進行高效的IPC,那麼獨特的'shmget()'鍵的一個不錯的選擇是將它們基於'gettid()'系統調用,它返回調用者的線程ID。不過,這是特定於Linux的。 –