2016-02-12 182 views
2

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

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内核,以及其他人可能会猜到的。

+0

根据'man 7 shm_overview',你可以'ftruncate'一个SHM对象。所以你的代码可能有问题。请创建一个[mcve]。 –

+0

@ColonelThirtyTwo举例。 – jot

+1

无法复制;该片段对我来说工作正常。 –

回答