POSIX C共享内存IPC API三处权限设置的差异及相关疑问
POSIX共享内存IPC权限问题解析
问题1:shm_open()指定O_RDONLY后,ftruncate()需要O_RDWR权限,该参数的意义是什么?
shm_open()的oflag参数控制当前进程对共享内存文件描述符的访问模式——O_RDONLY代表当前进程仅能读取该描述符对应的对象,而ftruncate()是修改共享内存大小的操作,本质属于对共享内存对象的写入类修改,必须依赖可读写权限(O_RDWR)才能执行。
核心逻辑是:oflag决定了当前进程打开共享内存后,允许对该文件描述符执行的操作范围。若仅开启只读权限,后续所有需要修改共享内存属性(如大小)的操作都会被系统权限机制拦截。
问题2:为何shm_open()需要同时设置mode权限位掩码?
mode参数用于设置新创建的共享内存对象的文件系统权限——当你在oflag中指定O_CREAT(创建新共享内存)时,这个掩码会定义其他进程后续访问该共享内存时的默认权限(和常规文件系统的权限逻辑一致,比如0644表示所有者读写、组及其他用户只读)。
如果不指定mode,新创建的共享内存对象权限会处于未定义状态,其他进程可能无法正常访问。注意:mode仅在创建新共享内存时生效,打开已存在的共享内存时该参数会被系统忽略。
问题3:若要创建供其他进程写入的只读共享内存,是否需先以写权限打开,再以只读模式映射,最后关闭文件描述符?
是的,标准流程如下:
- 调用
shm_open()时指定O_RDWR | O_CREAT的oflag,同时设置合适的mode(比如0666,允许其他进程读写),获取可读写的文件描述符; - 调用
ftruncate()设置共享内存的大小(这一步必须依赖可读写权限); - 调用
mmap()时指定PROT_READ的prot参数,将共享内存映射为当前进程的只读区域; - 关闭文件描述符(映射建立后,后续使用共享内存无需保留该描述符);
- 其他进程可通过
O_RDWR打开该共享内存,映射为可写区域执行写入操作。
通过这套流程,当前进程仅能读取共享内存,而其他进程可正常写入,完全符合需求。
内容的提问来源于stack exchange,提问作者Alessandro Bertulli
相关产品推荐
相关产品推荐

