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

时间:2017-02-08 17:17:38

标签: c call system

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

conn = DriverManager.getConnection("jdbc:sqlite:" + QUICKNOTES_USER_DB_FILENAME);

但未通过以下行

fd = open(path,0);

(即使没有模式0777) 我只是不明白放0而不是标志是什么意思,为什么它的工作。

1 个答案:

答案 0 :(得分:0)

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,并且您可以在相应的模式下打开目标文件 - 例如,路径可能指定一个目录,它是{{1}值为0.否则,您将从O_SEARCH中引出未定义的行为。 UB不必显示为返回错误指示符,如果它没有这样做则会告诉你什么。

附录:鉴于open()对您失败(如返回-1所示),通过检查open(path, O_RDONLY)来探讨错误的原因是值得的,或者更好的是,通过打印通过errno进行诊断。