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
相关产品推荐
相关产品推荐

