【发布时间】:2013-05-06 08:22:00
【问题描述】:
来自shm_open 手册页:
一个新的共享内存对象最初的长度为零。的大小 可以使用 ftruncate(2) 设置对象。 [...] shm_open() 函数 本身不会创建指定大小的共享对象,因为 这样做会复制一个现有的函数,该函数设置一个 文件描述符引用的对象。
这不会将应用程序暴露给竞争条件吗?考虑以下伪代码:
int fd = shm_open("/foo", CREATE);
if ( fd is valid ) {
// created shm object, so set its size
ftruncate(fd, 128);
} else {
fd = shm_open("/foo", GET_EXISTING);
}
void* mem = mmap(fd, 128);
由于shm_open 和ftruncate 调用(一起)不是原子的,您可能会遇到一个竞争条件,即一个进程调用shm_open(CREATE 情况),但在调用ftruncate 之前,另一个进程调用shm_open (GET_EXISTING case) 并尝试 mmap 大小为 0 的对象,甚至可能写入它。
我可以想出两种方法来避免这种竞争条件:
使用 IPC 互斥量/信号量使整个事物同步,或者...
如果安全(根据 POSIX),请在
CREATE和GET_EXISTING两种情况下调用ftruncate。
避免这种竞争条件的首选方法是什么?
【问题讨论】:
标签: c++ c linux shared-memory mmap