Windows는 기본적으로 자동 필수 파일 잠금으로 설정됩니다. UNIX는 기본적으로 수동 협업 파일 잠금으로 설정됩니다. 두 경우 모두 기본값을 무시할 수 있지만 두 경우 모두 일반적으로 그렇지 않습니다.
많은 오래된 Windows 코드는 fopen
네이티브 API (같은 함수) 대신 C / C ++ API (같은 함수 CreateFile
)를 사용합니다. C / C ++ API는 필수 잠금 작동 방식을 지정할 수있는 방법을 제공하지 않으므로 기본값을 얻게됩니다. 기본 "공유 모드"는 "충돌"조작을 금지하는 경향이 있습니다. 쓰기 위해 파일을 열면 실제로 파일에 쓰지 않는 경우에도 쓰기가 충돌하는 것으로 간주됩니다. 이름 변경을위한 Ditto
그리고 여기가 악화되는 곳이 있습니다. C / C ++ API는 읽기 또는 쓰기를위한 열기 외에 파일로 수행 할 작업을 지정할 수있는 방법을 제공하지 않습니다. 따라서 API는 법적 작업을 수행한다고 가정해야합니다. 잠금은 필수이므로 코드가 충돌 작업을 수행하지 않고 다른 목적으로 파일을 열었더라도 충돌 작업 open
을 허용 하는 잠금은 거부됩니다.
따라서 코드가 C / C ++ API를 사용하거나 이러한 문제에 대해 구체적으로 생각하지 않고 네이티브 API를 사용하는 경우 가능한 모든 작업을 수행하지 않으면 파일을 열 때마다 가능한 최대 작업 집합을 방해하고 파일을 열 수 없게됩니다. 일단 열면 충돌하지 않고 수행 할 수 있습니다.
제 생각에는 모든 프로그램이 공유 모드를 선택하고 현명하고 현명하게 실패한 경우를 처리하면 Windows 방법이 UNIX 방법보다 훨씬 효과적입니다. 그러나 코드가 이러한 문제에 대해 생각하지 않으면 UNIX 방법이 더 효과적입니다. 불행히도 기본 C / C ++ API는 공유 모드를 처리하고 충돌하는 방식으로 Windows 파일 API에 제대로 매핑되지 않습니다. 따라서 최종 결과는 약간 지저분합니다.