unix - ftruncate 第二次失败

标签 unix mmap

我试图在 shm_open 和 ftruncate 之后成功地超出共享内存对象。这是代码,

char *uuid = GenerateUUID();
int fd = shm_open(uuid, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
if(fd == -1) perror("shm_open");

size_t shmSize = sizeof(container);
int ret = ftruncate(fd, shmSize);
perror("ftruncate first");

ret = ftruncate(fd, shmSize * 2);
perror("ftruncate second");

它可以通过第一个 ftruncate,但对于第二个 ftruncate,它超过失败,errno=22,“参数无效”。

我也试过在mmap之后ftruncate内存对象,引用ftruncate的man page,shared memory应该被格式化为零到新的长度。

此外,我还尝试在子进程中 ftruncate 内存对象(这是两个进程之间的 IPC 主题),ftruncate 返回“无效的 fd,没有这样的文件或目录”,但我可以在子进程中成功打开 shm_open 和 mmap过程。

有什么想法吗?谢谢!

最佳答案

我认为这是 shm_open()ftruncate()mmap() 的已知“功能”。

你必须在第一次通过 ftruncate() 给共享内存一个长度,但随后的 ftruncate() 给出错误号 22,你可以简单地忽略。

关于unix - ftruncate 第二次失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20320742/

相关文章:

memory-leaks - Solr 使用太多内存

c++ - 具有映射的结构 vector 的结构

java - MappedByteBuffer.asFloatBuffer() 与内存中的 float[] 性能

regex - sed:在分隔记录中的引用字段中替换双引号

C 服务器奇怪的行为

shell - 列出目录中的所有文件夹名称 - unix shell 脚本

linux - 如何将 "read -p"之后的文字加粗?

regex - 在 sed 中使用正则表达式查找和替换

c++ - Mac 上的 mmap 手册页

c - 使用 mmap 共享结构数组