gpt4 book ai didi

c/linux - ftruncate 和 POSIX 共享内存段

转载 作者:太空狗 更新时间:2023-10-29 12:43:05 26 4
gpt4 key购买 nike

这里的最终目标是我希望能够扩展共享内存段的大小并通知进程在扩展后重新映射该段。然而,似乎在共享内存 fd 上第二次调用 ftruncate 失败并返回 EINVAL。我能找到的唯一其他问题没有答案:ftruncate failed at the second time

ftruncate 和 shm_open 的联机帮助页没有提到不允许在创建后扩展共享内存段,事实上它们似乎表明可以通过 ftruncate 调整它们的大小,但到目前为止我的测试表明并非如此。我能想到的唯一解决方案是销毁共享内存段并以更大的大小重新创建它,但是这将需要所有对段进行 mmap 处理的进程在对象被销毁并可用于重新创建之前取消映射它。

有什么想法吗?谢谢!

编辑:按照简单示例的要求

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>

int main(int argc, char *argv[]){
const char * name = "testfile";
size_t sz = 4096; // page size on my sys
int fd;
if((fd = shm_open(name, O_CREAT | O_RDWR, 0666)) == -1){
perror("shm_open");
exit(1);
}
ftruncate(fd, sz);
perror("First truncate");
ftruncate(fd, 2*sz);
perror("second truncate");

shm_unlink(name);
return 0;
}

输出:

First truncate: Undefined error: 0
second truncate: Invalid argument

编辑 - 答案:看来这是 POSIX 标准的 OSX 实现的问题,上面的代码片段适用于 3.13.0-53-generic GNU/Linux 内核,我猜可能还有其他内核。

最佳答案

关于您的最终目标,这是我编写的一个开源库,它似乎是匹配的:rszshm - resizable pointer-safe shared memory .

关于c/linux - ftruncate 和 POSIX 共享内存段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373511/

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