【发布时间】:2017-06-26 10:52:22
【问题描述】:
我正在尝试打开一个设备文件(但问题主要是针对一般文件)并且它正在使用下一行
fd = open(path,0);
但以下行失败
fd = open(path,O_RDONLY,0777)
(即使没有模式 0777) 我只是不明白放置 0 而不是标志是什么意思以及它为什么起作用。
【问题讨论】:
我正在尝试打开一个设备文件(但问题主要是针对一般文件)并且它正在使用下一行
fd = open(path,0);
但以下行失败
fd = open(path,O_RDONLY,0777)
(即使没有模式 0777) 我只是不明白放置 0 而不是标志是什么意思以及它为什么起作用。
【问题讨论】:
The POSIX specifications for open() 要求在标志中包含定义的常量 O_EXEC、O_RDONLY、O_WRONLY、O_RDWR 或 O_SEARCH 之一,但它们不指定 值 这些常量。事实上,他们在理由中指出“在历史实现中,O_RDONLY 的值为零”。在这样的实现中,将标志指定为 0 等效于指定(仅)O_RDONLY。
POSIX 对“历史”一词的使用不应被视为暗示O_RDONLY 很少有值为 0;相反,它在当今的实现中很常见。然而,当您的意思是 O_RDONLY 时,您不应将标志指定为 0,因为这会使您的代码在标志常量定义不同的系统上容易损坏。
如果您确实可以使用给定为 0 的标志打开但不能使用给定为O_RDONLY 的标志(这似乎值得怀疑),那么在您的实现中O_RDONLY 的值一定不同于 0。然后可能是强制常量组的其他成员之一的值为0,并且您可以以相应的模式打开目标文件-例如,路径可能指定一个目录,它是O_SEARCH值为 0。否则,您将从 open() 引发未定义的行为。 UB 不必显示为返回错误指示符,如果它碰巧没有这样做,那什么也不会告诉你。
附录:鉴于 open(path, O_RDONLY) 对您而言失败(如返回 -1 所示),值得通过检查 errno 来探查错误原因,或者更好的是通过 @987654338 打印诊断信息@。
【讨论】: