하위 프로세스가 분기되면 상위 프로세스의 파일 설명자를 상속합니다. 하위 프로세스가 파일 설명자를 닫으면 어떻게 되나요? 자식이 쓰기 시작하면 부모 측의 파일은 어떻게 되나요? 이러한 불일치를 관리하는 사람은 커널인가요, 아니면 사용자인가요?
프로세스가 close
파일 설명자를 통해 특정 파일을 닫는 함수를 호출하는 경우. 프로세스의 파일 테이블에서 참조 횟수는 1씩 감소합니다. 그러나 상위 프로세스와 하위 프로세스 모두 동일한 파일을 보유하므로 참조 횟수는 2이고 종료 후에는 1로 감소합니다. 0이 아니기 때문에 프로세스는 여전히 문제 없이 파일을 계속 사용합니다.
Terrence Chan UNIX 시스템 프로그래밍(파일에 대한 Unix 커널 지원)을 참조하세요.
답변1
하위 프로세스가 분기되면 상위 프로세스의 파일 설명자를 상속합니다. 하위 프로세스가 파일 설명자를 닫으면 어떻게 되나요?
그것은 상속복사파일 설명자. 따라서 자식의 설명자를 닫으면 자식에 대한 설명자는 닫히지만 부모의 설명자는 닫히지 않으며 그 반대의 경우도 마찬가지입니다.
자식이 쓰기 시작하면 부모 측의 파일은 어떻게 되나요? 이러한 불일치를 관리하는 사람은 커널인가요, 아니면 사용자인가요?
두 프로세스가 동일한 파일에 쓰는 것과 완전히 동일합니다(말 그대로). 커널은 프로세스를 독립적으로 예약하므로 파일에 인터리브된 데이터를 얻을 수 있습니다.
하지만,POSIX(*nix 시스템은 대부분 또는 완전히 호환됩니다.) 이는 C API(시스템 호출에 매핑됨)의 read()
기능이 write()
"일반 파일이나 기호 링크 [...]에서 작동할 때 서로 원자적입니다"라고 명시합니다. GNU C 매뉴얼도 임시로파이프라인에 대한 약속(기본값은 PIPE_BUF
단서의 일부인 64kiB입니다.) 이는 다른 언어/도구에 대한 호출(예: What end를 echo
사용하는cat
프로세스가 파일 설명자를 통해 열려 있는 특정 파일을 닫기 위해 close 함수를 호출하는 경우입니다. 프로세스의 파일 테이블은 참조 횟수를 1씩 감소시킵니다. 그러나 상위 프로세스와 하위 프로세스 모두 동일한 파일을 보유하고 있으므로(참조 횟수는 2이고 닫은 후 1씩 감소함) 0이 아니므로 프로세스는 여전히 문제 없이 파일을 계속 사용합니다.
상위 프로세스와 하위 프로세스라는 두 가지 프로세스가 있습니다. 두 가지에는 공통된 "참조 횟수"가 없습니다. 그들은 독립적입니다. WRT 파일 설명자 중 하나가 닫힐 때 어떤 일이 발생하는지에 대한 첫 번째 질문에 대한 답변을 참조하세요.
답변2
새로운 하위 프로세스가 생성될 때마다 fork()
파일 설명자는 전혀 보존되지 않고 변경됩니다.
파일이 중복되더라도 파일 설명자는 다릅니다.