ftruncate在Mac OS X中无法处理POSIX共享内存

时间:2014-08-26 09:20:28

标签: c linux macos shared-memory

我在Mac OS X上编写了一个代码来使用POSIX共享内存,如下所示:

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    int fileHandle = shm_open("TW_ShMem1",O_CREAT|O_RDWR, 0666);

    if(fileHandle==-1) {
       //error.

    } else {
        //Here, it is failing on Mac OS X
        if(-1==ftruncate(fileHandle, 8192)) {
            shm_unlink("TW_ShMem1");
            fileHandle = -1;
        } else {
            return 0;
        }
    }

    return 1;
}
Linux上的

ftruncate正在运行,没有任何问题。在Mac OS X上,它返回-1,errnoEINVAL(如调试器中所示)。

为什么失败?这里错过了什么?

1 个答案:

答案 0 :(得分:5)

这看起来像OSX行为 - ftruncate只能在段的初始创建上运行一次。任何后续调用都以这种方式失败。我可以找到的earliest reference是苹果邮件列表的帖子。

如果我在shm_unlink之前放置shm_open ftruncate一直有效。

假设您只想重新调整共享内存段的大小一次,您可以将ftruncate包装在fstat中以确定当前大小并在st_size == 0

的情况下调整大小

e.g。

struct stat mapstat;
if (-1 != fstat(fileHandle, &mapstat) && mapstat.st_size == 0) {
    ftruncate(fileHandle, 8192);
}