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修改会回写磁盘文件;

posted @ 2023-01-10 16:04  刘大侠GG_B  阅读(1327)  评论(0编辑  收藏  举报