홈페이지 » 어떻게 » 리눅스와 OS X에서 할 수있는 것처럼 Windows에서 사용중인 파일을 변경할 수없는 이유는 무엇입니까?

    리눅스와 OS X에서 할 수있는 것처럼 Windows에서 사용중인 파일을 변경할 수없는 이유는 무엇입니까?


    Linux 및 OS X를 사용하는 경우 운영 체제가 Windows에서 현재 사용중인 파일을 삭제하지 못하도록하지 않으므로 명시 적으로 금지됩니다. 뭐라 구요? 유닉스 계열 시스템에서 사용중인 파일을 편집하고 삭제할 수있는 이유는 무엇입니까??

    오늘의 질문 및 답변 세션은 Q & A 웹 사이트의 커뮤니티 중심 그룹 인 Stack Exchange의 하위 부문 인 수퍼 유저의 도움으로 이루어졌습니다..

    질문

    수퍼 유저 인 the.midget은 Linux와 Windows가 사용중인 파일을 다르게 취급하는 이유를 알고 싶어합니다.

    리눅스를 사용하기 시작한 이래로 저에게 당혹 스러웠던 점 중 하나는 파일 이름을 변경하거나 읽을 때 파일 이름을 삭제할 수 있다는 것입니다. 예를 들어 실수로 동영상을 재생하는 중에 삭제하려고 한 것입니다. 나는 그것이 성공했는지 여부와 상관없이 파일에서 무엇이든 바꿀 수 있다는 것을 배웠을 때 나는 놀랐다..

    그래서 장면 뒤에서 어떤 일이 일어나고 있으며 Linux에서 할 수있는 것처럼 윈도우에서 물건을 삭제하는 것을 막을 수 있습니다.?

    대답

    수퍼 유저 기고가들은이 위젯의 ​​상황을 밝힙니다. 놀라는 글 :

    Windows에서 파일을 열거 나 실행할 때마다 Windows는 파일을 제자리에 잠급니다 (단순화이지만 일반적으로 사실입니다). 프로세스에 의해 잠긴 파일은 해당 프로세스가 파일을 릴리스 할 때까지 삭제할 수 없습니다. Windows가 자체를 업데이트해야 할 때마다 재부팅해야 적용될 수 있습니다..

    반면에 리눅스 나 맥 OS X와 ​​같은 유닉스 계열의 운영체제는 파일을 잠그지 않고 기본 디스크 섹터를 잠급니다. 이것은 사소한 차이점으로 보일지 모르지만, 이미 파일이 열려있는 프로그램을 방해하지 않고 파일 시스템의 목차에있는 파일의 레코드를 삭제할 수 있음을 의미합니다. 따라서 파일이 여전히 실행 중이거나 사용 중일 때 파일을 삭제할 수 있으며 파일 테이블의 항목이 사라지더라도 일부 프로세스가 열린 핸들을 가지고있는 한 계속 디스크에 존재하게됩니다.

    데이비드 슈워츠 (David Schwartz)는 아이디어를 확장하고 이상적인 방식과 실제 상황을 강조합니다.

    Windows는 자동, 필수 파일 잠금을 기본값으로 사용합니다. UNIX는 기본적으로 수동, 협동 파일 잠금입니다. 두 경우 모두 기본값을 재정의 할 수 있지만 두 경우 모두 대개 기본값이 아닙니다..

    많은 오래된 Windows 코드는 네이티브 API (CreateFile과 같은 함수)보다는 C / C ++ API (fopen과 같은 함수)를 사용합니다. C / C ++ API는 강제 잠금이 작동하는 방법을 지정할 방법을 제공하지 않으므로 기본값을 얻습니다. 기본 "공유 모드"는 "충돌하는"작업을 금지하는 경향이 있습니다. 쓰기 위해 파일을 열면 실제로 파일에 쓰지 않아도 쓰기가 충돌하는 것으로 간주됩니다. 이름 바꾸기 동의.

    그리고 여기가 더 악화됩니다. C / C ++ API는 읽기 또는 쓰기 용으로 여는 것 이외에 파일로 수행 할 작업을 지정하는 방법을 제공하지 않습니다. 따라서 API는 귀하가 합법적 인 작업을 수행 할 것이라고 가정해야합니다. 잠금은 필수이므로 충돌하는 작업을 허용하는 열기는 충돌하는 작업을 수행하지 않으려 고했지만 다른 목적으로 파일을 여는 경우에도 거부됩니다.

    따라서 C / C ++ API를 사용하거나 이러한 문제에 대해 특별히 고려하지 않고 기본 API를 사용하는 경우 가능한 모든 작업을 수행 할 때까지 파일을 열 수없고 파일을 열 수없는 모든 가능한 작업의 최대 집합을 방지합니다. 일단 열리면 그것에 대해 수행 할 수있다..

    제 생각에 모든 프로그램이 공유 모드와 열린 모드를 현명하게 선택하고 실패 사례를 건전하게 처리한다면 Windows 방식은 UNIX 방식보다 훨씬 잘 작동합니다. 그러나 UNIX 방법은 코드가 이러한 문제를 신경 쓰지 않으면 더 잘 작동합니다. 불행하게도 기본 C / C ++ API는 공유 모드를 처리하고 충돌이 잘 열리는 방식으로 Windows 파일 API에 잘 맵핑되지 않습니다. 따라서 그물 결과는 좀 지저분합니다..

    파일 처리에 대한 두 가지 다른 접근 방식으로 두 가지 결과를 얻을 수 있습니다..


    설명에 추가 할 것이 있습니까? 의견에서 소리가 나지. 다른 기술에 정통한 Stack Exchange 사용자의 답변을 더 읽고 싶습니까? 전체 토론 스레드를 여기에서 확인하십시오..