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

ftruncate和shm_open的手册页中没有提到不允许在创建后扩展共享内存段,实际上,它们似乎表明可以通过ftruncate来调整它们的大小,但到目前为止,我的测试还显示了其他方面。我能想到的唯一解决方案是销毁共享内存段并以更大的尺寸重新创建它,但是这将要求所有映射了该段的进程都将其取消映射,然后再销毁对象并将其重新创建。

有什么想法吗?谢谢!

编辑:作为简单的示例要求

#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通用GNU/Linux内核,可能还有其他我猜到的内核。

最佳答案

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

09-06 21:34