플래그는 있지만 모드(즉, 없음)가 있는 파일을 사용한 open(...)
다음 파일에 데이터를 쓰고 닫는 것이 가능하다는 것을 알았습니다.O_CREAT|O_WRONLY
0400
w
이것은 나에게 약간 모순되지만 그것이 어떻게 작동하는지 이해할 수 있습니다.
그러나 최근 CIFS 마운트 파일 시스템에서 이 접근 방식에 문제가 발생했습니다.
이제 다음 두 진술 중 어느 것이 올바른지 궁금합니다.
- 기술적으로(POSIX) 이는 일부 파일 시스템에서 작동하는 "지원되지 않거나 문서화되지 않은" 기능입니다.
또는
- CIFS에서 작동하지 않는다는 사실은 CIFS 구현 방식의 단점입니다.
권위 있는 답변을 찾고 있었지만 찾을 수 없습니다. 공식 POSIX 표준을 참조하는 것이 좋을 것입니다.
답변1
O_CREAT|O_WRONLY 플래그를 사용하여 파일을 열 수 있지만(...) 0400 모드를 사용하면(즉, w 없이) 파일에 데이터를 쓰고 닫을 수 있다는 것을 알았습니다.
이는 권한 비트가 변경되는 방식과 일치합니다.아니요열린 파일 설명자에 대한 액세스에 영향을 줍니다. 개념적으로는 권한이 있는 파일을 생성한 0600
다음 쓰기 전용 모드로 열고 권한을 로 변경하는 것을 상상할 수 있습니다 0400
. 시스템은 다른 프로세스가 중간 쓰기를 위해 시스템을 열도록 허용하지 않고 이 모든 것을 원자적으로 수행합니다.
나는 볼 수 없다open()
시스템 호출에 대한 설명O_WRONLY
명시적으로 이 작업을 수행할 수 있지만 열린 fd가 얻는 권한과 다른 권한이 무엇인지 제어하는 방법에 암시적인 것이 있다고 생각합니다.모델매개변수는 생성된 파일에 대해 설정된 권한 비트를 제어합니다. 두 가지 다른 것 그리고 그것아니요어떤 식으로든 관련성이 있어야 한다고 가정해 보세요.
또한 EACCES에 대한 설명은 다음과 같습니다.
[EACCES] 경로 접두사의 구성 요소에 대한 검색 권한이 거부되었습니다.또는 파일이 존재하고 권한이 지정되었습니다.초과분거절당하다, 또는 파일이 존재하지 않고 생성될 파일의 상위 디렉터리에 대해 쓰기 권한이 거부되었거나 O_TRUNC가 지정되어 쓰기 권한이 거부되었습니다.
즉, 권한 비트는 이미 존재하는 파일에만 적용됩니다. 그러나 나열된 표준 오류 조건이 유일한 오류 조건일 수 있다고 가정하는 것이 어느 정도 제정신인지는 확실하지 않습니다.
CIFS는 다른 전통에서 유래했기 때문에 이것이 "전통적인" Unixy 파일 시스템이나 POSIX 사양과 다른 유일한 점은 아니라고 생각합니다.