我在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,errno
为EINVAL
(如调试器中所示)。
为什么失败?这里错过了什么?
答案 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);
}