파일 기술자와 포크


15

자식이 포크되면 부모의 파일 설명자를 상속받습니다. 자식이 파일 설명자를 닫으면 어떻게됩니까? 아이가 글을 쓰기 시작하면 부모의 말에 파일에 어떤 일이 일어날까요? 이러한 불일치, 커널 또는 사용자를 누가 관리합니까?

프로세스가 close파일 디스크립터를 통해 특정 열린 파일을 닫기 위해 함수를 호출 할 때 . 프로세스의 파일 테이블에서 참조 횟수는 1 씩 감소합니다. 그러나 부모와 자식이 모두 같은 파일을 보유하고 있으므로 참조 횟수는 2이고 닫은 후에는 1로 줄어 듭니다. 0이 아니기 때문에 프로세스는 여전히 문제없이 파일을 계속 사용합니다.

Terrence Chan UNIX 시스템 프로그래밍 (파일에 대한 Unix 커널 지원)을 참조하십시오.


좋아, 마지막 코멘트 결코 마음을)에 대한 매뉴얼 페이지에서를 open()하고 fork()거기 구별이다 파일 Descript, 이하 또는파일 descipt - 이온 - 전자 나중에 말하며, 포크의 설명이 사본이 있지만, 그들은 같은 설명을 참조하십시오. 그러나 테스트 할 때 자녀의 손잡이를 닫는 것이 부모의 손잡이를 닫는 것을 의미하지는 않습니다. 두 핸들이 쓸 때 데이터 인터리빙에 미묘한 차이를 만들 수 있다고 생각하지만 어쨌든 불확실하므로 정확하게 어떻게 발생하는지는 중요하지 않습니다.
금발 미녀

답변:


29

자식이 포크되면 부모의 파일 설명자를 상속받습니다. 자식이 파일 설명자를 닫으면 어떻게됩니까?

파일 디스크립터 의 사본 을 상속합니다 . 따라서 자식에서 설명자를 닫으면 자식에 대한 설명자가 닫히지 만 부모는 닫히지 않습니다.

아이가 글을 쓰기 시작하면 부모의 말에 파일에 어떤 일이 일어날까요? 이러한 불일치, 커널 또는 사용자를 누가 관리합니까?

동일한 파일에 쓰는 두 개의 프로세스와 정확히 동일합니다. 커널은 프로세스를 독립적으로 예약하므로 파일에 인터리브 된 데이터가있을 수 있습니다.

그러나 POSIX (* nix 시스템이 전체적으로 또는 완전히 준수 됨) 는 C API (시스템 호출에 매핑)의 기능 read()write()기능이 "일반 파일에서 작동 할 때 서로에 대해 [...] 심볼릭 링크 ". GNU C는 파이프와 관련하여 수동으로 이것을 약속합니다 ( 제공의 PIPE_BUF일부인 기본값 은 64 kiB입니다). 즉, echo또는의 사용과 같은 다른 언어 / 도구로 된 호출이 cat해당 계약에 포함되어야하므로 두 개의 독립 프로세스가 "hello"와 "world"를 동일한 파이프에 동시에 쓰려고하면 end는 "helloworld"또는 "worldhello"이며 "

프로세스 호출 닫기 함수가 파일 디스크립터를 통해 특정 열린 파일을 닫는 경우. 프로세스의 파일 테이블은 참조 횟수를 1 씩 감소시킵니다. 1) 0이 아니기 때문에 프로세스는 여전히 문제없이 파일을 계속 사용합니다.

부모와 자식이라는 두 가지 프로세스가 있습니다. 둘 다에 공통적 인 "참조 횟수"는 없습니다. 그들은 독립적입니다. WRT 중 ​​하나가 파일 설명자를 닫을 때 발생하는 상황은 첫 번째 질문에 대한 답변을 참조하십시오.


1

fork()새로운 자식을 만들 때마다 파일 디스크립터는 전혀 유지되지 않으며 변경됩니다.

파일은 중복되지만 파일 설명자는 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.