- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
来自 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_open
和 ftruncate
调用(一起)不是原子的,您可能有一个竞争条件,其中一个进程调用 shm_open
(CREATE
案例)但是,在调用 ftruncate
之前,另一个进程调用 shm_open
(GET_EXISTING
案例)并尝试 mmap
0 大小的对象,甚至可能写入它。
我可以想到两种方法来避免这种竞争情况:
使用 IPC mutex/semaphore 使整个事情同步,或者...
如果安全(根据 POSIX),在 CREATE
和 GET_EXISTING
情况下调用 ftruncate
。
避免这种竞争条件的首选方法是什么?
最佳答案
您的方法(从两者调用 ftruncate
)应该可行,但是无论如何您都需要一种方法来同步内容的使用。由于内存最初是空的(零填充),因此不包含有效的同步对象,除非您要使用原子来滚动自己的同步对象,否则您无论如何都需要一种辅助形式的同步来控制对共享内存的访问。
我通常认为,与其让多个进程竞相创建或打开具有固定名称的共享内存段,不如让所有者进程负责创建具有随机 名称,使用 O_EXCL
来避免随机或恶意冲突,然后在您成功打开它、调整它的大小并在其中创建同步对象后将该名称传递给其他进程需要访问它。
关于c++ - shm_open 和 ftruncate 竞争条件可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502767/
我试图在 shm_open 和 ftruncate 之后成功地超出共享内存对象。这是代码, char *uuid = GenerateUUID(); int fd = shm_open(uuid, O
我想在每个循环中截断一个文件并重新写入。所以,我使用下面的代码。 但是,这里发生的是我在每个循环的开始处获得了一些额外的空间。没有空间,因为第一次没有添加空间(我也尝试了修剪功能)。 你能帮帮我吗?
我正在尝试使用函数 ftruncate() 来截断文件。 我从网上查到事情是这样的: int ftruncate(int fildes, off_t length); 但我不知道为参数 int fd
我正在尝试用 C++ 编写一个类,它提供一种原子追加到文件的方法,即使在写入过程中出现电源故障的情况下也是如此。 首先,我将当前文件位置(从文件开头开始的 64 位偏移量,以字节为单位)写入一个单独的
我的应用程序尝试用 ftruncate() 和 mmap() 编辑 32-33KB 和 2MB 大页面,但它退出了。 然后我意识到 ftruncate() 失败了: int fd = open("/m
我正在尝试制作一个 C 程序,通过使用 ftruncate 截断或扩展输入文件来将输入文件的大小更改为所需的大小。它还必须使用命令行参数。 例如,以下是有效输入: ./changefilesize d
我正在尝试打开一个共享内存文件并写入其中。问题是 ftruncate 正在返回 -1。 这是我的代码: #include #include #include #include #include
来自 http://pubs.opengroup.org/onlinepubs/7908799/xsh/ftruncate.html 的描述,不是很清楚 ftruncate 是如何工作的。 如果假设,
我想通过使用此文档来构建android源代码: https://source.android.com/source/building-running.html 最后一步是:'make -j16' 一段
我正在尝试修改文件的大小。我正在使用 msys2。我的代码如下所示: #include #include #include void dummy_file(){ FILE *f = fo
据我所知,当我将文件扩展到 2 GB 长度时,ftruncate(2) 不能是原子的。 但幕后究竟发生了什么?我已经应用它,当多个线程扩展文件时它似乎工作正常,但我不确定它是否不会导致任何数据丢失。
我查看了来自 here 的 ftruncate 文档,以及来自 here .对于 IBM 链接,我相应地实现了 ftruncate,但它给我 Invalid Arguments 错误。这是代码: ch
他们都可以根据我的测试改变文件大小。为什么他们都可以将文件更改为更大或更短?fallocate 和 ftruncate 有什么区别? 最佳答案 ftruncate 是一个简单的单一用途函数。 Per
平台是 ARM 上的 Ubuntu Linux。我想将一个字符串写入文件,但我希望每次都截断文件然后写入字符串,即不追加。 我有这个代码: f=fopen("/home/user1/refresh.t
来自 shm_open 手册页: A new shared memory object initially has zero length. The size of the object can be
我想创建一个共享内存对象并将其截断为特定大小。 SHMSIZE定义为512 MODE 设置为 S_IRUSR | S_IWUSR | S_IWGRP | S_IRGRP | S_IWOTH | S_I
当我们创建共享内存时,我们使用 shm_open() 和 ftruncate() 函数。根据我的信息,shm_open() 创建一个共享内存区域。然后我们使用 ftruncate() 函数来配置共享内
我有几个问题基于以下来源: #include #include #include #include int g; int main(void) { int fd = shm_open(
当我想在 linux 中映射一些共享内存时,我会这样做: hFileMap = open(MapName, O_RDWR | O_CREAT, 438); pData = mmap(NULL, Siz
这里的最终目标是我希望能够扩展共享内存段的大小并通知进程在扩展后重新映射该段。然而,似乎在共享内存 fd 上第二次调用 ftruncate 失败并返回 EINVAL。我能找到的唯一其他问题没有答案:f
我是一名优秀的程序员,十分优秀!