我试图打开一个设备文件(但问题主要是针对一般文件)并且它正在使用下一行
conn = DriverManager.getConnection("jdbc:sqlite:" + QUICKNOTES_USER_DB_FILENAME);
但未通过以下行
fd = open(path,0);
(即使没有模式0777) 我只是不明白放0而不是标志是什么意思,为什么它的工作。
答案 0 :(得分: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,并且您可以在相应的模式下打开目标文件 - 例如,路径可能指定一个目录,它是{{1}值为0.否则,您将从O_SEARCH
中引出未定义的行为。 UB不必显示为返回错误指示符,如果它没有这样做则会告诉你什么。
附录:鉴于open()
对您失败(如返回-1所示),通过检查open(path, O_RDONLY)
来探讨错误的原因是值得的,或者更好的是,通过打印通过errno
进行诊断。