假设我使用以下参数调用shmget
:
int shmid = shmget(KEY, 1024*4096, IPC_CREAT|0644);
并且进一步假设具有键KEY
的段已经存在。权限模式位如何对shmflg
的{{1}}参数(在这种情况下,0644
)进行OR运算会影响shmget
的行为? shmget
是否对具有这些权限标记的段的权限执行任何类型的“权限验证?具体来说,验证需要什么?”
答案 0 :(得分:1)
对于已经存在指定键的共享内存段的情况,
shmflg argument
的{{1}} [...]中的权限模式位如何影响shmget
的行为?
POSIX解释这个问题有点棘手,但意图似乎是它与shmget
类似地操作。也就是说,如果进程的uid和gid以及所请求的模式与段的uid,gid和权限不一致,则该函数将失败。具体地,
如果出现以下情况,
open()
函数将失败:[...]密钥存在共享内存标识符,但shmget()
的低位9位指定的操作权限将不被授予[。 ..]。
shmflg
的Linux联机帮助页有类似的文字,并且具体说明了
如果共享内存段已存在,则验证权限[...]。
这与POSIX没有什么不同,只是更明确。
Another section of POSIX提供了更多详细信息,可以归结为根据其euid和egid,根据适用于该进程的权限位集授予或拒绝读取和/或写入访问。
shmget是否对具有这些权限标记的段的权限执行任何类型的权限验证?具体来说,验证需要什么?
是,如上所述和链接的POSIX规范中所述。
我仍然有点不清楚shmget()
"的低位九位指定了什么"操作权限?是。有人可以将其解释为调用进程在创建它时对该段有的权限,但我认为这实际上意味着shmflg
中打开的所有模式位都在分段的权限字段。