为什么等效代码的开放系统调用模式值不同?

Why are the open system call mode values different for equivalent code?

下面的代码和引用的语句来自Linux System Programming by Robert Love。 我不明白第一个和第二个代码示例中的模式如何相同。

从第一个例子开始,我计算出众数为

USR -> 2+1 = 3
GRP -> 2+1 = 3
OTH -> 1 =   1

所以我的期望是 0331,但书上说是 0664。

我的逻辑有什么问题?

从下面的书中复制:

int fd;
fd = open (file, O_WRONLY | O_CREAT | O_TRUNC, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH);
if(fd == -1)
 /* error */

Trading portability (in theory at least) for readability, we could have written the following, to identical effect:

int fd;
fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0664);
if(fd == -1)
 /*error*/

无论出于何种原因,您选择使用错误的常量值。

  • 而不是 S_IRUSR 是 0400,你决定它是 0200
  • 而不是 S_IWUSR 是 0200,你决定它是 0100
  • 等等

如果您使用正确的常量值,您将得到相同的结果。