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() 函数中的标志的主要内容,如果未能解决你的问题,请参考以下文章