MacOS shm-无法在shm中获取真实的数据大小



在MacOS上执行shm相关开发时,搜索到的进程显示在以下代码中(验证确实正确(。

然而,有一个新问题无法解决。研究发现,当ftruncatshm_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

暂时使用以下结构将数据记录到shm中。写入或读取之前的第一个操作是获取data_len字段的值,然后从后面确定要读取和写入的数据的长度。希望有一种更简洁的方法,就像在Linux下使用lseek((一样。

shm mem map :
----shm mem----
struct {
long data_len;
data[1];
data[2];
...
data[data_len];
}
---------------
long *shm_mem = (long *)shmAddr;
long data_size = shm_mem[0];     // Before reading, you need to determine whether the shm file is empty and whether the pointer is valid. It is omitted here.
char *shm_data = (char *)&(shm_mem[1]);
char *buffer = (char *)malloc(data_size);
memcpy(buffer, shm_data, data_size);

相关内容

最新更新