问:使用 shm_open 函数创建共享内存设备文件,shm_open 函数返回一个文件描述符,然后使用 mmap 函数映射该共享内存到进程的虚拟空间内,mmap 函数返回一个虚拟地址,之后便可以通过这个虚拟地址对共享内存进行读和写操作。
但是使用 shm_open 创建文件后,使用 mmap 函数进行映射会出现下图中的错误。
答:如果一个文件的数据长度为 0,则不能使用 mmap 建立映射,此时使用 mmap 函数将会失败。对于共享内存设备上的文件,不能保证在所有的系统中都能够使用 write 函数( SylixOS 中使用 write 函数操作内存设备上的文件将直接返回错误)。为了更好的可移植性,在创建文件后,可以使用 ftruncate 函数调整文件大小。 ftruncate 函数的使用参考上图 20 行位置注释掉的代码实现。