gpt4 book ai didi

c++ - shm_open 和 ftruncate 竞争条件可能吗?

转载 作者:IT王子 更新时间:2023-10-29 01:19:35 25 4
gpt4 key购买 nike

来自 shm_open 手册页:

A new shared memory object initially has zero length. The size of the object can be set using ftruncate(2). [...] The shm_open() function itself does not create a shared object of a specified size because doing so would duplicate an extant function that sets the size of an object referenced by a file descriptor.

这不会使应用程序处于竞争状态吗?考虑以下伪代码:

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_openftruncate 调用(一起)不是原子的,您可能有一个竞争条件,其中一个进程调用 shm_open (CREATE 案例)但是,在调用 ftruncate 之前,另一个进程调用 shm_open(GET_EXISTING 案例)并尝试 mmap 0 大小的对象,甚至可能写入它。

我可以想到两种方法来避免这种竞争情况:

  1. 使用 IPC mutex/semaphore 使整个事情同步,或者...

  2. 如果安全(根据 POSIX),在 CREATEGET_EXISTING 情况下调用 ftruncate

避免这种竞争条件的首选方法是什么?

最佳答案

您的方法(从两者调用 ftruncate)应该可行,但是无论如何您都需要一种方法来同步内容的使用。由于内存最初是空的(零填充),因此不包含有效的同步对象,除非您要使用原子来滚动自己的同步对象,否则您无论如何都需要一种辅助形式的同步来控制对共享内存的访问。

我通常认为,与其让多个进程竞相创建或打开具有固定名称的共享内存段,不如让所有者进程负责创建具有随机 名称,使用 O_EXCL 来避免随机或恶意冲突,然后在您成功打开它、调整它的大小并在其中创建同步对象后将该名称传递给其他进程需要访问它。

关于c++ - shm_open 和 ftruncate 竞争条件可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com