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

Using numerical equivalent of IPC_CREAT in shmget() C

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

我试图在 0600 的许可下创建共享内存。首先我使用了形式化方法=>IPC_CREAT | 0600,它起作用了。然后不是对两者进行按位或运算,而是使用 01600,我无法观察到结果有任何差异,但不确定它是否适用于所有情况,因为我是 C 编程的新手。

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

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

但问题是: 宏可以因系统而异,因此您不应依赖系统中的值。

并且使用幻数会降低代码对其他人和您的可读性。当我看到它时,我可以理解 IPC_CREAT | 0600 的意思 - rwx 八进制是众所周知的 - 但如果我看到它,我可能会说 "what the heck is 01600" 。一段时间后,您也可能不记得那是什么。

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

最好习惯使用第一个,事实上,它更容易维护您的软件。

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

shm_open(..., O_RDWR|IPC_CREAT);