【发布时间】:2017-09-21 14:44:36
【问题描述】:
我在一个遗留项目中看到了以下代码模式:
-
检查是否已创建名为“/abc”的共享内存:
int fd = shm_open("/abc", O_RDWR, 0777); if(fd != -1) { close(fd); return -1; } -
移除之前由
shm_open()创建的对象:shm_unlink("/abc"); -
创建一个共享内存对象:
fd = shm_open("/abc", (O_CREAT | O_RDWR), S_IWUSR);
第 2 步是多余的吗?
代码可以运行到第 2 步,因为“/abc”的共享内存对象不存在。换句话说,如果对象确实存在,代码就会返回。为什么要显式调用 shm_unlink 来移除不存在的对象?
我们可以将这三个步骤缩短为一个吗?
我认为我们可以如下进行,我们使用标志O_EXCL 来检查是否存在旧内存对象,如果根本不存在则创建它。 shm_open() 手册页说:
O_EXCL如果还指定了 O
_CREAT,并且共享内存对象 给定名称已经存在,返回错误。这 检查对象是否存在,如果 它不存在,以原子方式执行。
所以把上面的所有代码都换成一行应该没问题:
int fd = shm_open("/abc", O_RDWR | O_EXCL, 0777);
对吗?
【问题讨论】:
-
您应该替换原始序列,因为它包含一个竞争窗口,另一个进程可以利用该窗口来访问共享内存。
标签: c linux shared-memory