在 Linux 上要使用共享内存时,比较常用的是使用 mmap 映射文件的方式:前几天在写一个程序时,执行却出现 mmap 报错:
./test_mmap tmp.txt mmap: Invalid argument
程序如下:
#include#include #include #include #include int main(int argc, char **argv) { int fd; struct stat sb; char *mmapped; if (argc != 2) { return -1; } fd = open(argv[1], O_RDWR); if(fd < 0) { perror("open"); return -1; } if(fstat(fd, &sb) == -1) { perror("fstat"); return -1; } mmapped = mmap(NULL, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (mmapped == MAP_FAILED) { perror("mmap"); return -1; } close(fd); mmapped[0] = '1'; if(msync((void*)mmapped, sb.st_size, MS_SYNC) == -1) { perror("msync"); return -1; } munmap((void *)mmapped, sb.st_size); return 0; }
之前也遇到过这个问题,但是忘记了是怎么回事,又花了一点时间找原因。为了避免重蹈覆辙,故写篇文章记录下。
原因在我的环境上,报这个错的原因是 mmap 映射的文件不是本机上的! 我的 Ubuntu 是在虚拟机里,而宿主机是 macOS,宿主机的一个文件夹共享到虚拟机中,我执行程序时 mmap 的文件正是在这个共享文件夹中的,所以会报这个奇怪的错误。



