자식이 포크되면 부모의 파일 설명자를 상속받습니다. 자식이 파일 설명자를 닫으면 어떻게됩니까?
파일 디스크립터 의 사본 을 상속합니다 . 따라서 자식에서 설명자를 닫으면 자식에 대한 설명자가 닫히지 만 부모는 닫히지 않습니다.
아이가 글을 쓰기 시작하면 부모의 말에 파일에 어떤 일이 일어날까요? 이러한 불일치, 커널 또는 사용자를 누가 관리합니까?
동일한 파일에 쓰는 두 개의 프로세스와 정확히 동일합니다. 커널은 프로세스를 독립적으로 예약하므로 파일에 인터리브 된 데이터가있을 수 있습니다.
그러나 POSIX (* nix 시스템이 전체적으로 또는 완전히 준수 됨) 는 C API (시스템 호출에 매핑)의 기능 read()
과 write()
기능이 "일반 파일에서 작동 할 때 서로에 대해 [...] 심볼릭 링크 ". GNU C는 파이프와 관련하여 수동으로 이것을 약속합니다 ( 제공의 PIPE_BUF
일부인 기본값 은 64 kiB입니다). 즉, echo
또는의 사용과 같은 다른 언어 / 도구로 된 호출이 cat
해당 계약에 포함되어야하므로 두 개의 독립 프로세스가 "hello"와 "world"를 동일한 파이프에 동시에 쓰려고하면 end는 "helloworld"또는 "worldhello"이며 "
프로세스 호출 닫기 함수가 파일 디스크립터를 통해 특정 열린 파일을 닫는 경우. 프로세스의 파일 테이블은 참조 횟수를 1 씩 감소시킵니다. 1) 0이 아니기 때문에 프로세스는 여전히 문제없이 파일을 계속 사용합니다.
부모와 자식이라는 두 가지 프로세스가 있습니다. 둘 다에 공통적 인 "참조 횟수"는 없습니다. 그들은 독립적입니다. WRT 중 하나가 파일 설명자를 닫을 때 발생하는 상황은 첫 번째 질문에 대한 답변을 참조하십시오.
open()
하고fork()
거기 구별이다 파일 Descript, 이하 또는 과 파일 descipt - 이온 - 전자 나중에 말하며, 포크의 설명이 사본이 있지만, 그들은 같은 설명을 참조하십시오. 그러나 테스트 할 때 자녀의 손잡이를 닫는 것이 부모의 손잡이를 닫는 것을 의미하지는 않습니다. 두 핸들이 쓸 때 데이터 인터리빙에 미묘한 차이를 만들 수 있다고 생각하지만 어쨌든 불확실하므로 정확하게 어떻게 발생하는지는 중요하지 않습니다.