【发布时间】:2015-03-24 00:47:53
【问题描述】:
在类 unix 系统上,尝试在文件描述符上调用 write 函数有时会导致错误:
[EBADF] fildes is not a valid file descriptor open for writing.
这通常是在使用open 和不包括O_WRONLY 或O_RDWR 的标志组合打开文件描述符时。
(见 man 2 open,man 2 write 了解更多信息)
那么问题来了:
在什么情况下有效使用O_APPEND、O_TRUNC、O_CREAT 中的任何一个调用open,而不传递其中一个写入标志?
这特别是因为我最近遇到的一个问题,即仅传递 O_APPEND 标志将成功打开文件,但在 fd 上调用 write 将导致 EBADF 因为我未能传递其他内容比O_RDONLY 和open 通话。
如果标志的组合无效(例如,O_APPEND 没有任何写入标志),我希望open 应该失败并出现一些错误,但事实并非如此。这是有什么原因,还是只是历史 posix 标准的产物?
是否存在O_APPEND + O_RDONLY 是有效组合的情况?
【问题讨论】:
-
因为它没有。为什么做出最初的决定并不重要,在这里推测它是无关紧要的,只是讨论。为什么做出设计决定现在可能会产生什么不同?事实是它在编译期间不会失败,因此您需要确保指定有效的标志组合。
-
@KenWhite: s/valid/useful/
-
@KenWhite 它实际上非常相关,具体参见github.com/rust-lang/rust/issues/23626
-
您的问题是问为什么标准 C 库
open()不验证它收到的标志组合。没有提到生锈的设计考虑。标签(或文本)也不会生锈。正如它(写得很好)一样,它被表述为对当时做出历史决定的原因的讨论。 -
@KenWhite 老实说,我不确定你想从我这里得到什么。如果我的问题在措辞方面不符合 SO 问题的严格标准,我很抱歉。但是,我认为这是一个简单的是/否答案,我只需要一个明确的答案:是否存在 O_APPEND + O_RDONLY 是有效组合的情况?我很高兴忽略这个的整个历史方面,它真的不相关,除了它可能会通知某些情况,在这些情况下上述内容是有效的。
标签: c io system-calls