从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
大小写)并尝试mmap
0对象大小,甚至可能写入。我可以想到两种避免这种竞争状况的方法:
ftruncate
和CREATE
情况下都调用GET_EXISTING
。 哪种方法可以避免这种竞争状况?
最佳答案
您的方法(从这两者中都调用ftruncate
)应该可以工作,但是无论如何,您都需要一种同步使用共享内存段内容的方法。由于内存最初是空的(零填充),因此不包含有效的同步对象,除非您要使用原子滚动自己的内存,否则无论如何,您都需要使用辅助同步形式来控制对共享内存的访问。
我想通常情况下,您希望有一个所有者进程负责创建带有随机名称的段,使用O_EXCL
避免随机产生,而不是进行多个进程争用来创建或打开具有固定名称的共享内存段或恶意冲突,然后将其成功传递给其他需要访问该名称的进程,然后将其传递给其他需要访问该进程的进程。