![](/img/trans.png)
[英]Using fallocate() after shm_open() results in memory not being freed after shm_unlink()
[英]Why call shm_unlink first before calling shm_open?
我在遗留项目中看到了以下代码模式:
检查是否已使用名称“/ 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,因为“/ abc”不存在共享内存对象。 换句话说,如果对象确实存在,则代码返回。 我们为什么要显式调用shm_unlink来删除不存在的对象?
我想我们可以按照以下步骤进行,我们使用标志O_EXCL
检查是否存在旧的内存对象,如果它根本不存在则创建它。 shm_open()
手册页说:
O_EXCL
如果还指定了O
_CREAT
,并且已存在具有给定名称的共享内存对象,则返回错误。 检查对象是否存在以及如果不存在则创建它是以原子方式执行的。
所以用一行替换上面的所有代码应该没问题:
int fd = shm_open("/abc", O_RDWR | O_EXCL, 0777);
那是对的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.