2011-10-13 5 views
0

자식 프로세스가 부모 프로세스에서 분기되면 부모 프로세스의 모든 변수가 새 자식 프로세스에 복사됩니다. 따라서 fork가 일어나기 전에 공통 파일을 열고 부모와 자식 모두에서 동일한 파일을 읽으려고하면 결과 모두를 독립적으로 인쇄해야합니다. 하지만 이것을 구현하려고 할 때, 부모와 자식을위한 파일 읽기가 인터리브 된 것처럼 보입니다. 왜 이런 일이 일어나는지 알아야합니다. 새로운 프로세스가 부모로부터 분기 될 때 파일 기술자조차도 복제되어야한다. 그래서 뭐가 잘못 됐어?fork()의 ​​filedescriptor 동작

#include<stdio.h> 
#include<fcntl.h> 

main() 
{ 
int fp; 
char buff[11]; 
int pid; 
fp = open("file1.txt", O_RDONLY); 
pid = fork(); 
if(pid==0) 
{ 
    printf("Child begins %d\n", getpid()); 
    read(fp, buff, 5); 
    buff[10] = '\0'; 
    printf("Child read:"); 
    puts(buff); 
    printf("Child exiting\n"); 
} 
else 
{ 
    read(fp, buff, 5); 
    buff[10] = '\0'; 
    printf("Parent read:"); 
    puts(buff); 
    printf("Parent exiting\n"); 
} 
} 

이제 file1.txt의 콘텐츠가 "Hello world"라고 가정하면 상위 프로세스와 하위 프로세스 모두 "Hello"가 인쇄되어야합니다. 하지만 내가 본 것은 아이/부모 프린트 중 하나 인 "Hello"이고 다른 하나는 "world"입니다.

답변

1

파일 설명자는 복제되지만 시스템 파일 테이블의 SAME 항목을 가리키고 있으므로 두 프로세스가 동일한 파일 포인터를 공유합니다. 커널 read() 및 writes()는 원자 단위이므로 각 프로세스는 파일 포인터가 다른 요소에 의해 이동 된 후에 파일 포인터를 보게됩니다.