2012-07-30 69 views
0

鑑於這種代碼:以相同名稱創建共享內存段 - 返回錯誤?

char * pathname; // some string 
int returnValue = shm_open(pathname, O_CREAT | O_TRUNC | O_RDWR, mode); // create a shared memory object 

如果我這樣做:注意 - 相同的路徑名)

int returnValue2 = shm_open(pathname, O_CREAT | O_TRUNC | O_RDWR, mode); // create a shared memory object 

我沒有得到任何錯誤,並且返回值是好的(0)!

這是否意味着我正在重新創建共享內存段/對象?

回答

2

您只是重新打開現有的共享內存段。

O_CREAT 

創建共享存儲器對象,如果它不存在。 (...)

O_EXCL 

如果O_CREAT也被指定,並與給定名稱的共享內存對象已經存在,返回一個錯誤。

(在Linux man shm_open。)

另外,從POSIX(有點更明確的):

O_CREAT 

如果共享存儲器對象存在,該標誌沒有任何影響,除非在下面的O_EXCL中註明。否則,創建共享內存對象。 (...)

2

shm_open()man page報價:

返回值: 成功時,shm_open()返回一個非負文件描述符。失敗時,shm_open()返回-1。

基於此,我會說你已經創建並打開或打開了一個現有的共享內存對象。

+0

如何創建共享內存,並且如果用戶嘗試使用相同的'pathname'創建,則返回'-1',而不將'pathname'保留在某種結構中像'pathname'-s的鏈表?謝謝 – ron 2012-07-30 17:37:40

+0

我認爲這是在發佈的其他答案,我相信你必須做的是添加'O_CREAT'標誌。雖然我不是這方面的專家。 – 2012-07-30 17:39:32

相關問題