打开功能中模式位的含义是什么?

What is meaning of mode bits in open function?

在这个 header /usr/src/linux-headers-5.0.0-38/include/uapi/asm-generic/fcntl.h 中,我发现了以下定义:

#define O_ACCMODE 00000003
#define O_RDONLY  00000000
#define O_WRONLY  00000001
#define O_RDWR    00000002
#ifndef O_CREAT
#define O_CREAT      00000100 /* not fcntl */
...
  1. opening modesetting flag有什么区别?模式是 O_* 和标志 S_*,但在 open(2) 方法中两者都可以是 write/read-only。
  2. O_ACCMODE 00000003是什么数字系统,是八进制吗?所以可以取值在0-7之间?那么最大数是77777777? (我是初学者)
  3. 最后一个 - 我可以在文件的特定访问中自定义 flags/mode 吗?第一个标志 O_ACCMODE 不在 open(2) 的文档中(为什么),这是否意味着我不能在该方法中使用它?

提前致谢。

What are difference between opening mode and setting flag? Mode is O_* and flag S_*, but both can be write/read-only in open(2) method.

联机帮助页对此进行了解释:O_* 常量进入 flags 参数(有一些限制),S_* 常量进入 mode 参数(仅用于某些情况下,例如传递 O_CREAT 等时)。

在尝试理解内核或 libc 代码之前,最好研究手册页和不同的标准。

What kind of numeric system is O_ACCMODE 00000003, is it octal?, so it can have values between 0-7?, then maximum number is 77777777?

是的,以 0 开头后跟一个数字的数字是八进制的。这是由 C 标准定义的。

在 C 语言中,最大整数是 INT_MAX。虽然在使用 open 时不需要那个。

can I make my custom flags/mode in specific access of files?

不,你不应该定制。

The first flag O_ACCMODE is not in documentation in open(2) (why), does that mean, I cannot use it in that method?

该标志由 POSIX 定义,是检索访问模式的掩码。你不应该将它传递给 open,所以它没有记录在那里。