C 以参数0作为标志打开系统调用

C 以参数0作为标志打开系统调用,c,call,system,C,Call,System,我试图打开一个设备文件(但问题主要是一个普通文件),它正在处理下一行 fd = open(path,0); 但失败的原因如下 fd = open(path,O_RDONLY,0777) (即使没有0777模式) 我只是不明白用0代替标志的意义是什么,为什么它会起作用。要求标志中只包含一个定义的常量O_EXEC,O_RDONLY,O_WRONLY,O_RDWR,或O_SEARCH,但它们没有指定这些常量的值。事实上,他们在原理中指出,“在历史实现中,O_RDONLY的值为零。”在这种实现中,将

我试图打开一个设备文件(但问题主要是一个普通文件),它正在处理下一行

fd = open(path,0);
但失败的原因如下

fd = open(path,O_RDONLY,0777)
(即使没有0777模式) 我只是不明白用0代替标志的意义是什么,为什么它会起作用。

要求标志中只包含一个定义的常量
O_EXEC
O_RDONLY
O_WRONLY
O_RDWR
,或
O_SEARCH
,但它们没有指定这些常量的值。事实上,他们在原理中指出,“在历史实现中,
O_RDONLY
的值为零。”在这种实现中,将标志指定为0相当于指定(only)
O_RDONLY

POSIX使用的术语“历史”不应被视为表明
O_RDONLY
的值很少为0;相反,它在当今的实现中非常常见。然而,当您的意思是
O_RDONLY
时,不应将标志指定为0,因为这会使您的代码在具有不同标志常量定义的系统上容易被破坏

如果您确实可以使用指定为0的标志打开,但不能使用指定为
O_RDONLY
的标志打开(这似乎值得怀疑),那么在您的实现中,
O_RDONLY
的值一定与0不同。然后,可能是强制常量组的其他成员之一的值为0,您可以在相应的模式下打开目标文件——例如,可能路径指定了一个目录,而值为0的正是
O_SEARCH
。否则,您将从
open()
中引出未定义的行为。UB不必显示为返回一个错误指示符,如果它碰巧没有这样做,那么这不会告诉您什么


附录:鉴于
open(path,O_RDONLY)
对您无效(如返回-1所示),有必要通过检查
errno
,或者通过
peror()

打印诊断来探究错误的原因,更好的方法是通过
O_EXEC
,只需要一个定义的常量
O_EXEC
O_RDONLY
O_WRONLY
O_RDWR
O_SEARCH
可以包含在标志中,但它们不指定这些常量的值。事实上,他们在原理中指出,“在历史实现中,
O_RDONLY
的值为零。”在这种实现中,将标志指定为0相当于指定(only)
O_RDONLY

POSIX使用的术语“历史”不应被视为表明
O_RDONLY
的值很少为0;相反,它在当今的实现中非常常见。然而,当您的意思是
O_RDONLY
时,不应将标志指定为0,因为这会使您的代码在具有不同标志常量定义的系统上容易被破坏

如果您确实可以使用指定为0的标志打开,但不能使用指定为
O_RDONLY
的标志打开(这似乎值得怀疑),那么在您的实现中,
O_RDONLY
的值一定与0不同。然后,可能是强制常量组的其他成员之一的值为0,您可以在相应的模式下打开目标文件——例如,可能路径指定了一个目录,而值为0的正是
O_SEARCH
。否则,您将从
open()
中引出未定义的行为。UB不必显示为返回一个错误指示符,如果它碰巧没有这样做,那么这不会告诉您什么


附录:鉴于
open(path,ordonly)
对您来说失败(如返回-1所示),通过检查
errno
,或者通过
peror()
打印诊断,探索错误原因是值得的