繁体   English   中英

为什么在调用shm_open之前先调用shm_unlink?

[英]Why call shm_unlink first before calling shm_open?

我在遗留项目中看到了以下代码模式:

  1. 检查是否已使用名称“/ abc”创建共享内存:

     int fd = shm_open("/abc", O_RDWR, 0777); if(fd != -1) { close(fd); return -1; } 
  2. 删除先前由shm_open()创建的对象:

     shm_unlink("/abc"); 
  3. 创建共享内存对象:

     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);

那是对的吗?

第2步是多余的吗?

它是。 它没有任何意义。

除此之外,“检查存在”容易出现TOCTOU漏洞。

我们可以将上述3步骤缩短为一步

是。 这是正确的方法。 但是你还需要O_CREAT标志(代码中缺少)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM