소프트 링크와 하드 링크가 모두 파일에 대한 포인터인 경우.
파일 설명자는 열린 파일을 가리키는 파일 핸들입니다.
둘 다 파일에 대한 포인터라면 둘 사이의 차이점은 정확히 무엇입니까?
게다가 하드링크는 파일 내용의 주소 위치를 가리키고, 파일 디스크립터도 파일 내용을 가리킨다고 하는데, 여기서 차이점은 무엇인가? 하드 링크에는 자체 파일 설명자가 있습니다.
답변1
철학적으로는 다르지 않다고 말할 수 있습니다.
그러나 왜, 어디서, 어떻게 사용되고 구현되는지는 완전히 다릅니다.
첫째, 하드 링크와 소프트/기호 링크는 모두 디렉토리 항목입니다. 즉, 이들은 디렉토리라고 하는 특별히 형식화된 파일의 항목/레코드입니다. 여기서 각 레코드는 이름과 inode 번호를 보유합니다. 후자는 실제 구조 저장을 참조합니다. 예배 규칙서. 파일의 메타데이터(권한, 크기 등) 및 데이터 블록 목록 - "inode"라는 구조.
하드 링크와 심볼릭 링크의 차이점은 하드 링크는 실제 데이터가 포함된 inode를 가리키는 반면, 심볼릭 링크는 다른 파일에 대한 경로가 포함된 inode를 가리키는 것입니다. 기본적으로 심볼릭 링크 자체는 다음과 같습니다.딱딱한명명된 파이프, Unix 도메인 소켓 파일 등과 같은 특수 유형의 파일에 대한 링크입니다.
이제 커널은 파일을 열 때 메모리 내 구조를 생성하고 디스크에서 inode를 복사하며 동일한 메타데이터(권한, 데이터가 포함된 블록 목록, 크기 등) 중 일부를 포함합니다. 이 구조는 "열린 파일 설명"이라는 또 다른 구조에 의해 지정됩니다(위치 포인터, 파일이 읽기-쓰기 모드로 열렸는지 읽기 전용 모드로 열렸는지, 비차단 모드에서 읽기-쓰기를 수행해야 하는지 여부 등의 정보를 보유합니다). , 등. ). 마지막으로, 이 구조는 파일 설명자 테이블이라는 배열/테이블인 다른 커널(프로세스별) 구조의 항목에 의해 지정됩니다.
"파일 설명자"(open(2)와 같은 시스템 호출에 의해 반환되는 정수)는 이 테이블에 대한 인덱스입니다.
메모리 내 inode는 여러 프로세스의 여러 파일 설명자가 가리킬 수 있는 여러 "열린 파일 설명"으로 가리킬 수 있습니다.
일부 시스템 호출(예: open(2))은 기호 링크를 특별히 처리합니다. 열려 있는 파일이 기호 링크로 판명되면 내용 경로로 명명된 파일을 계속 열려고 시도합니다.
디스크 구조(디렉터리, inode)와 커널/메모리 구조(inode, 열린 파일 설명) 모두 참조 계산을 사용하여 어떤 구조가 어떤 구조를 사용하는지 추적합니다. (아니요, 커널에는 어떤 객체가 더 이상 다른 곳에서 참조되지 않는지 확인하기 위해 메모리나 디스크의 포인터를 점프하는 표시 및 청소 가비지 수집기가 없습니다 ;-)).