在shmget()C中使用IPC_CREAT的数值等效项

时间:2019-03-13 15:17:29

标签: c permissions ipc shared-memory

我正在学习如何使用shmget()创建共享内存。到目前为止,我发现的所有示例都使用IPC_CREAT | <shm_perm>格式标记(或类似标记)。当我检查自己的bits/ipc.h内容IPC_CREAT被定义为01000时。

我试图创建一个0600许可的共享内存。首先,我使用形式化方法=> IPC_CREAT | 0600,它起作用了。然后我没有观察到结果只是使用01600进行按位“或”运算,而是因为我是C编程新手,所以无法确定结果是否适用于所有情况。

这可能有些琐碎,但我想知道为什么使用OR-ing方法而不是仅将01与所需的权限类型连接起来更好(我发现后一种方法更容易记住和键入)。

  • 形式化方法是否具有特殊功能,后者缺乏(可能与OS相关)?
  • 如果我对后一种方法更满意,可以安全使用后一种方法吗?

2 个答案:

答案 0 :(得分:3)

前一种方法是调用该函数的正确方法,因为它使您的代码系统独立。仅仅因为在您的开发系统上IPC_CREAT被定义为01000,但这并不意味着它在其他任何地方都相同(尽管对于同一操作系统的主要版本,它很有可能保持不变)。

最好习惯使用第一个,事实上,这样可以更轻松地维护软件。

我什至建议尽量使用适当的常量替换0600,如:

shm_open(..., O_RDWR|IPC_CREAT);

答案 1 :(得分:2)

您可以执行printf("%o\n", IPC_CREAT | 0600)进行检查。如果我的系统中IPC_CREAT为01000,它将打印1600。

但这是问题所在: 宏会因系统而异,因此您不应该依赖系统中的值。

使用幻数会使代码对他人和您的可读性降低。我可以理解IPC_CREAT | 0600的含义-rwx八进制是众所周知的-但如果看到它,我可能会说“到底是什么01600”。而且,过一会儿您可能也不会记得它是什么。