为什么每次使用 EAGAIN 时 open() 都会失败?

Why does open() fails every time with EAGAIN?

为什么像 Apache 这样的程序无法打开普通文件? 运行 它在 strace 下显示:

open("access.log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = 11

11 代表 EAGAINEWOULDBLOCK

其中:

$ ls -l access.log
-rw-rw-rw- 1 root root 2 Jun  9 17:52 access.log

如果我 su 作为 www-data 我可以安全地写入文件。

11 是文件描述符,不是错误代码。这意味着您看到的 open 呼叫成功而不是失败。如果 open 失败,它将 return -1 并且 strace 将显示如下内容:

open("access.log", O_RDONLY)            = -1 ENOENT (No such file or directory)