2012-06-24 5 views
1

이 가능한 중복 : 리눅스에서
Are file descriptors shared when fork()ing?리눅스의 포크와 시스템 리소스

한다고 가정 나는 다음 한 코드 :

나는 약 fork 문서에서 알고 무엇
int main() 
{ 
    FILE* f = fopen("file.txt", "w"); 
    fork(); 
    fwrite("A", 1, 1, f); 
    fclose(f); 
    return 0; 
} 

가있다 현재 프로세스의 복사본을 만듭니다. 메모리의 상태도 복사하므로 * f는 두 인스턴스에서 동일해야합니다. 하지만 파일 핸들과 같은 시스템 리소스는 어떻게됩니까? 이 예제에서는 쓰기 의도로 파일을 열어 하나의 인스턴스 만 파일에 쓸 수 있습니다. 어떤 인스턴스가 실제로 파일에 기록됩니까? 누가 파일 핸들을 더 신경 써야하고 fclose()를 호출해야합니까?

답변

1

두 프로세스 모두 핸들을 얻습니다. 둘 다 쓸 수 있지만 현재 오프셋을 공유합니다. 둘 다 닫아야하며 각각은 자체 핸들을 닫습니다.

+0

unbeli, fork() 후에 자식 프로세스에서 exec()를 호출하면 응용 프로그램이 방금 종료 된 것처럼 자식 프로세스의 모든 공유 리소스가 올바르게 닫힙니다. –

+0

@DmitryBespalov 글쎄, 그들은 (당신이 FD_CLOEXEC를 설정하지 않는 한) exec()에서 닫히지 않을 것이지만, 물론 자식이 끝나면 닫힐 것입니다. 하지만 부모의 핸들에는 영향을 미치지 않습니다. 부모 핸들을 닫거나 부모가 종료 될 때까지 열려 있습니다. – unbeli