2013-11-25 4 views
0

버퍼링 된 IO 스트림의 경우 fork()에서 이상한 동작이 발생합니다.fork() 및 버퍼링 된 IO 스트림

아래 표시된 샘플 코드에서 읽히는 파일의 크기는 252 바이트입니다. fork() 뒤에는 자식이 성공적으로 줄을 읽고 화면에 인쇄하고 있습니다. 그러나 컨트롤이 부모로 돌아 가면 파일 오프셋이 어떤 이유로 파일 끝으로 설정되고 부모 프로세스가 스트림에서 아무 것도 읽을 수 없습니다. fork()이 파일 설명자 (시스템 호출 read()write()을 사용하여 동일한 프로그램을 복제 할 때 잘 동작 함)를 생성하면 상위 프로세스가 스트림에서 다음 행을 읽지 만 여기서는 발생하지 않는 것으로 예상됩니다. 파일 오프셋은 컨트롤이 부모에 도달 할 때 파일의 끝으로 설정됩니다. 누군가가 이것에 대해 밝힐 수 있습니까?

int main(void) 
{  
    char buffer[80]; 
    FILE *file; 
    pid_t pid; 
    int status; 

    /* Open the file: */ 
    file = fopen(FILENAME, "r"); 

    if ((pid = fork()) == 0){ 
     fgets(buffer, sizeof(buffer), file); 
     printf("%s", buffer); 
    } 
    else{ 
     waitpid(pid, &status, 0); 
     printf("Offset [%d]\n", ftell(file)); 

     fgets(buffer, sizeof(buffer), file); 
     printf("%s", buffer); 
    } 
} 

답변

0

자식 프로세스의 fgets()는 파일에서 데이터를 읽을 때 완전히 버퍼링됩니다. 내 시스템에서 완전히 버퍼링 된 버퍼의 크기는 1024입니다. 따라서 단일 read()는 fgets() 버퍼에있는 파일의 전체 내용 (252 바이트)을 갖습니다. 따라서 컨트롤이 부모로부터 자식으로 돌아 오면 오프셋은 파일의 끝으로 설정됩니다.

반환하기 전에 자식 프로세스에서 fflush()를 수행하면 fgets() 버퍼의 데이터가 삭제되므로 컨트롤이 부모에 도달하면 offest 파일이 올바르게 다시 설정됩니다.