2012-07-30 83 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