You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux open()系统调用标志的二进制转换结果是否正确?

Linux open()系统调用flags参数的二进制值验证与疑问

我正在学习NASM,对Linux open()系统调用的flags参数取值存在疑问。查阅man手册未找到底层数值,根据相关资料得知这些标志需按位或使用,遂在Ubuntu系统的/usr/include/asm-generic/fcntl.h中找到其八进制定义:

#define O_ACCMODE   00000003
#define O_RDONLY    00000000
#define O_WRONLY    00000001
#define O_RDWR      00000002
#define O_CREAT     00000100    /* not fcntl */
#define O_EXCL      00000200    /* not fcntl */
#define O_NOCTTY    00000400    /* not fcntl */
#define O_TRUNC     00001000    /* not fcntl */
#define O_APPEND    00002000
#define O_NONBLOCK  00004000
#define O_DSYNC     00010000    /* used to be O_SYNC, see below */
#define O_DIRECT    00040000    /* direct disk access hint */
#define O_LARGEFILE 00100000
#define O_DIRECTORY 00200000    /* must be a directory */
#define O_NOFOLLOW  00400000    /* don't follow links */
#define O_NOATIME   01000000
#define O_CLOEXEC   02000000    /* set close_on_exec */

#define __O_SYNC    04000000
#define O_SYNC      (__O_SYNC|O_DSYNC)
#define O_PATH      010000000
#define __O_TMPFILE 020000000
#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)

了解到前导零表示八进制数后,我将其转换为二进制形式:

O_RDONLY    = 0b                            0   /* was 0o0 */
O_WRONLY    = 0b                            1   /* was 0o1 */
O_RDWR      = 0b                           10   /* was 0o2 */
O_ACCMODE   = 0b                           11   /* was 0o3 */
O_CREAT     = 0b                     100 0000   /* was 0o100 */
O_EXCL      = 0b                    1000 0000   /* was 0o200 */
O_NOCTTY    = 0b                  1 0000 0000   /* was 0o400 */
O_TRUNC     = 0b                 10 0000 0000   /* was 0o1000 */
O_APPEND    = 0b                100 0000 0000   /* was 0o2000 */
O_NONBLOCK  = 0b               1000 0000 0000   /* was 0o4000 */
O_DSYNC     = 0b             1 0000 0000 0000   /* was 0o10000 */
O_DIRECT    = 0b           100 0000 0000 0000   /* was 0o40000 */
O_LARGEFILE = 0b          1000 0000 0000 0000   /* was 0o100000 */
O_DIRECTORY = 0b        1 0000 0000 0000 0000   /* was 0o200000 */
O_NOFOLLOW  = 0b       10 0000 0000 0000 0000   /* was 0o400000 */
O_NOATIME   = 0b      100 0000 0000 0000 0000   /* was 0o1000000 */
O_CLOEXEC   = 0b     1000 0000 0000 0000 0000   /* was 0o2000000 */
O_SYNC      = 0b  10 0000 0000 0000 0000 0000   /* was 0o10000000 */
O_TMPFILE   = 0b 100 0000 0000 0000 0000 0000   /* was 0o20000000 */

我推测部分标志存在位冲突无法同时使用,想确认此次转换过程是否有误,以及这些二进制值是否可作为open()的有效标志?


内容的提问来源于stack exchange,提问作者dundermouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:14:52