IPC_CREAT 有啥用| 0666 C 中 shmget() 函数中的标志

Posted

技术标签:

【中文标题】IPC_CREAT 有啥用| 0666 C 中 shmget() 函数中的标志【英文标题】:What is the use of IPC_CREAT | 0666 flag in shmget() function in CIPC_CREAT 有什么用| 0666 C 中 shmget() 函数中的标志 【发布时间】:2016-11-02 12:46:18 【问题描述】:

shmget for IPC in linux

有人能解释一下 IPC_CREAT |0666 在上面代码中的 shmget() unix 系统调用中到底做了什么吗,我知道 0666 在这里是八进制值,但是改变它根本没有任何效果。

【问题讨论】:

如果新创建的共享内存段不存在,则将其权限设置为S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH(所有人的读写权限)。 那么在 IPC_CREAT 之后我可以使用的八进制值集是多少? .... ,如果我将其设置为 IPC_CREAT | 0600,这是否意味着只有创建共享内存段的程序才能访问它?还是意味着它可以访问任何拥有密钥的人? 如果分段是使用权限 0600 创建的,则只有创建它的用户才能访问它。 (好吧,超级用户也可以访问它。)可以使用shmctl() 更改权限和所有权。 您是否考虑阅读the documentation?还是the other documentation?或者与这些相关的任何文档? 【参考方案1】:

0666 是 linux 中通常的访问权限,以 rwx 八进制格式并具有序列(所有者-组-用户)。 IPC_CREAT 的值是 sys/ipc.h 头文件中定义的十进制值 512。

IPC_CREAT|0666 基本上执行按位或两者的运算来设置shmget 中的标志,并且它们都只是执行它们通常的功能。 0666 设置内存段的访问权限同时 IPC_CREAT 告诉系统为共享内存创建一个新的内存段。

如果不使用此标志,则shmget() 将查找与 key 关联的段并检查用户是否有权访问该段。

【讨论】:

IPC_CREAT 定义为 0x01000,对应 4096。如果是 512,则对应 0x200,即 IPC_CREAT | 0666 = 0666,IPC_CREAT 在这个等式中是多余的 @Adhamzhon Shukurov 不,它是八进制的 01000,而不是十六进制的 0x01000。 01000(八月)== 512(十二月)。 0666 也是八进制的,所以它不是多余的。 github.com/torvalds/linux/blob/master/include/uapi/linux/ipc.h

以上是关于IPC_CREAT 有啥用| 0666 C 中 shmget() 函数中的标志的主要内容,如果未能解决你的问题,请参考以下文章

C 函数中的静态变量有啥用? [复制]

C程序IPC消息

C 中的共享内存 (sysV)

python中的set有啥用

C中__IO和静态关键字有啥用?

python 格式化字符串有啥用