当段已存在时,如何使用shmget权限位?

时间:2016-08-03 18:08:53

标签: c shared-memory

假设我使用以下参数调用shmget

int shmid = shmget(KEY, 1024*4096, IPC_CREAT|0644);

并且进一步假设具有键KEY的段已经存在。权限模式位如何对shmflg的{​​{1}}参数(在这种情况下,0644)进行OR运算会影响shmget的行为? shmget是否对具有这些权限标记的段的权限执行任何类型的“权限验证?具体来说,验证需要什么?”

1 个答案:

答案 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中打开的所有模式位都在分段的权限字段。