Это всего лишь теория ....
Глядя на исходный код ядра Linux, кажется, что при некоторых обстоятельствах системный вызов close(fd)
пытается выполнить внутреннюю очистку перед закрытием.Если fd
был связан с файлом в «файловой системе», где можно было изменить действующие разрешения на доступ, когда файл был открыт, то вполне возможно, что сбрасывание при закрытии может завершиться неудачей, поскольку текущие разрешения слишком ограничительныЭто может превратиться в сбой системного вызова EACCES.
Такой сбой встречается редко, потому что разрешение файла изменяться как раз в «правильное» время, чтобы вызвать сбой;то есть между системным вызовом close
и предыдущими системными вызовами write
.
Кроме того, возможно, что это произойдет только для определенных типов файлов;например, файлы на удаленном файловом сервере, где удаленный сервер реализует управление доступом.
Обратите внимание, что сбой close()
с EACCES не предусмотрен ручным вводом Linux или спецификациями POSIX.Документы подразумевают, что доступ проверяется только при открытии файла, это (по крайней мере) неожиданное поведение.
Однако обратная сторона заключается в том, что различные аспекты поведения (виртуальной) файловой системы зависят от реализации самих файловых систем.И есть несколько случаев, когда файловые системы не ведут себя "нормально".