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

时间:2016-02-12 22:46:24

标签: c linux shared-memory

这里的最终目标是,我希望能够扩展共享内存段的大小,并通知进程在扩展后重新映射段。然而,似乎在共享内存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

编辑 - 答:似乎这是OSX实现POSIX标准的一个问题,上面的代码片段适用于3.13.0-53通用的GNU / Linux内核以及我猜的其他内容。

1 个答案:

答案 0 :(得分:0)

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