Unix 환경의 고급 프로그래밍 3rd, 4.21, rmdir이 링크 계산을 처리하는 방법을 알고 싶습니다.

Unix 환경의 고급 프로그래밍 3rd, 4.21, rmdir이 링크 계산을 처리하는 방법을 알고 싶습니다.

APUE 3rd, 4.21에서 이 내용을 읽었습니다. 링크 수가 0에 도달할 때 하나 이상의 프로세스에 디렉터리가 열려 있으면 함수가 반환되기 전에 마지막 링크가 제거되고 점 및 점 항목이 삭제됩니다. 나는 이것을 이해할 수 없습니다. "링크 수가 0에 도달했습니다"는 "링크 수가 2에 도달했습니다"라고 생각했습니다. 빈 디렉토리에는 링크 수가 2개 이상 있습니다. rmdir이 링크 계산을 어떻게 처리하는지 알고 싶습니다.

답변1

당신은 혼란스러워합니다. rmdir링크 수에는 전혀 신경 쓰지 마십시오. 논리는 매우 간단합니다.

일단 파일이링크 수0이고 실행 중인 프로세스에 참조(파일 설명자 또는 현재 디렉터리)가 없으면 실제로 삭제됩니다. 이제 디스크 공간을 다른 목적으로 재활용할 수 있습니다[*].

디렉토리는 파일입니다. 그러나 링크를 해제(상위 파일에서 제거)하려면 다른 유형의 파일보다 더 많은 고려 사항이 필요합니다. 이 디렉토리의 모든 하위 디렉토리도 연결 해제되어 있는지 확인해야 합니다. 그렇지 않으면 하위 링크 수를 업데이트할 기회를 잃을 수 있습니다. 우리는 그 디스크 공간을 영구적으로 잃게 될 것입니다.

따라서 우리는 사용자가 디렉토리를 호출하는 것을 허용하지 않습니다 unlink. 대신 rmdir두 가지 방식만 rmdir다른 특수 목적의 .call을 사용해야 합니다.unlink

  1. 디렉토리는 "비어 있어야" 합니다. 즉, 하위 디렉토리에는 표준 ...항목만 있어야 합니다.
  2. unlink디렉터리 자체에서 실행하기 전에 나머지 두 항목의 연결이 해제되었는지 확인합니다 .

그건그것. 다른 마법은 없습니다. rmdir1항의 조건이 충족될 때까지 연기되지 않습니다. rmdir호출되면 성공하거나 실패합니다. 이 조건은 어떤 방식으로든 링크 수를 기반으로 하지 않습니다.


.특별한 경우는 아니지만 링크 수에 대한 항목의 효과가 흥미롭다고 생각합니다 . 이는 상위 디렉토리에 대한 하드 링크이므로 링크 수가 늘어납니다. 이것이 새로 생성된 디렉터리 DIR의 링크 수가 2인 이유입니다. 이후에 호출하면 rmdir DIR링크 DIR/.와 가 제거되므로 링크 수가 0으로 돌아갑니다 DIR.


Linux에서는 실제로 디렉터리 내부에서 셸을 실행하고 ls -ld디렉터리 연결이 해제된 후(상위 디렉터리에서 제거됨) 이를 실행하여 위의 내용을 관찰할 수 있습니다.

물론 ls -ld약어 ls -ld .. 디렉토리 항목이 삭제된 후에도 계속 작동합니다 .. ..실제로 최신 Linux는 실제로 이러한 디스크 상의 디렉토리 항목에 의존하지 않습니다. 나는 초기 Unix 구현이아니요이것을 지원하십시오. 그러나 참조 카운팅은 위에서 설명한 대로 여전히 작동하며 디렉터리를 삭제하는 특별한 경우는 없다고 생각합니다.

(일을 계속하는 방법이 ..더 흥미롭습니다. 아래 의견에서 논의하십시오).

사실, 쉽게 볼 수 있습니다 rmdir.특별한 권한으로 실행되는 사용자 프로그램으로 구현됨. 역사적인 Unix 코드는 온라인에서 쉽게 찾을 수 있습니다. 이것이 제가 이것에 대해 그렇게 확신하는 이유 중 하나입니다.


df .[*] 따라서 사용된 디스크 블록(또는 아이노드)의 차이를 보면 파일이 삭제되었는지 확인할 수 있습니다 df -i .. 이 접근 방식은 Linux와 같은 파일 시스템에서 잘 작동합니다 ext4. 그러나 덜 전통적인 파일 시스템에는 최적화가 더 복잡하여 관찰하기가 더 어려울 수 있습니다.

관련 정보