mmap: Operation not permitted
char *map_shm = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
该种情况下会报 mmap: Operation not permitted
修改为 char *map_shm = mmap(NULL, size, PROT_READ, MAP_PRIVATE , fd, 0);
则不会报错。
分析:
打开的fd所对应的文件可能为只读的,不允许写入,所以使用MAP_PRIVATE 则可以通过。
mmap成功以后,fd可以立即关闭,而不影响mmap
2、private的修改不会回写硬盘文件,并且是copy-on-write模式,文件未修改时指向的共享文件内容(此时其他进程修改文件,private是可见的,因为是同一块内存。当private修改了内存以后,
private重新申请一块内存,此时其他进程再修改文件内容private将看不到修改)
3、share修改会回写磁盘文件;