【问题标题】:Open system call with parameter 0 as a flag打开以参数 0 为标志的系统调用
【发布时间】:2017-06-26 10:52:22
【问题描述】:

我正在尝试打开一个设备文件(但问题主要是针对一般文件)并且它正在使用下一行

fd = open(path,0);

但以下行失败

fd = open(path,O_RDONLY,0777)

(即使没有模式 0777) 我只是不明白放置 0 而不是标志是什么意思以及它为什么起作用。

【问题讨论】:

    标签: c call system


    【解决方案1】:

    The POSIX specifications for open() 要求在标志中包含定义的常量 O_EXECO_RDONLYO_WRONLYO_RDWRO_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 打印诊断信息@。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2011-09-25
      • 2019-07-10
      • 1970-01-01
      • 2014-03-26
      • 2016-12-29
      • 2013-07-07
      相关资源
      最近更新 更多