2016-02-12 178 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

無法複製;該片段對我來說工作正常。 –

回答