我正在学习如何使用shmget()
创建共享内存。到目前为止,我发现的所有示例都使用IPC_CREAT | <shm_perm>
格式标记(或类似标记)。当我检查自己的bits/ipc.h
内容IPC_CREAT
被定义为01000
时。
我试图创建一个0600
许可的共享内存。首先,我使用形式化方法=> IPC_CREAT | 0600
,它起作用了。然后我没有观察到结果只是使用01600
进行按位“或”运算,而是因为我是C编程新手,所以无法确定结果是否适用于所有情况。
这可能有些琐碎,但我想知道为什么使用OR-ing方法而不是仅将01
与所需的权限类型连接起来更好(我发现后一种方法更容易记住和键入)。
答案 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”。而且,过一会儿您可能也不会记得它是什么。