【发布时间】:2020-03-28 03:44:47
【问题描述】:
在MacOS上进行shm相关开发时,搜索到的进程如下代码所示(验证确实正确)。
但是,有一个新问题无法解决。发现ftruncat为shm_fd调整内存大小时,是按照页面大小的倍数分配的。
但是这种情况下,当共享内存文件被其他进程打开时,无法正确获取到实际数据大小。获取的文件大小是页面的整数倍,追加数据时会报错。
// write data_size = 12
char *data = "....";
long data_size = 12;
shmFD = shm_open(...);
ftruncate(shmFD, data_size); // Actually the size actually allocated is not 12, but 4096
shmAddr = (char *)mmap(NULL, data_size, ... , shmFD, 0);
memcpy(shmAddr, data, data_size);
// read
...
fstat(shmFD, &sb)
long context_len_in_shm = sb.st_size;
// get wrong shm size -> context_len_in_shm = 4096
【问题讨论】:
-
lseek(shmFD, SEEK_END, 0)给出的长度是否正确? -
@KenThomases 不,lseek() 总是返回 -1。我在 Linux 上使用 lseek,一切正常,但在 MacOS 上却不行
标签: macos shared-memory