在 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
与所需的权限类型连接起来(我发现后一种方法更容易记住和键入).
- 有没有形式化方法有而后者没有的特点(可能与OS有关)?
- 如果我更习惯使用后一种方法是否安全?
您可以通过 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);
我正在学习如何使用 shmget()
创建共享内存。到目前为止,我发现的所有示例都使用 IPC_CREAT | <shm_perm>
格式作为标志(或类似的东西)。当我检查我的 bits/ipc.h
内容时 IPC_CREAT
被定义为 01000
。
我试图在 0600
的许可下创建共享内存。首先我使用了形式化方法=>IPC_CREAT | 0600
,它起作用了。然后不是对两者进行按位或运算,而是使用 01600
,我无法观察到结果有任何差异,但不确定它是否适用于所有情况,因为我是 C 编程的新手。
这可能是一件微不足道的事情,但我想知道为什么最好使用 OR-ing 方法而不是将 01
与所需的权限类型连接起来(我发现后一种方法更容易记住和键入).
- 有没有形式化方法有而后者没有的特点(可能与OS有关)?
- 如果我更习惯使用后一种方法是否安全?
您可以通过 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);