2012-04-27 4 views
2

나는이 link에서 아래의 코드를 말하는 겁니다 : - 부모와 자식다른 프로세스에서 포크 후 디스크립터를 사용할 수 없게 되었습니까?

while (1) 
{ 
    newsockfd = accept(sockfd, 
       (struct sockaddr *) &cli_addr, &clilen); 
    if (newsockfd < 0) 
    error("ERROR on accept"); 
    pid = fork(); 
    if (pid < 0) 
    error("ERROR on fork"); 
    if (pid == 0) 
    { 
    close(sockfd); 
    dostuff(newsockfd); 
    exit(0); 
    } 
    else 
    close(newsockfd); 
} /* end of while */ 

void dostuff (int sock) 
{ 
    int n; 
    char buffer[256]; 

    bzero(buffer,256); 
    n = read(sock,buffer,255); 
    if (n < 0) error("ERROR reading from socket"); 
    printf("Here is the message: %s\n",buffer); 
    n = write(sock,"I got your message",18); 
    if (n < 0) error("ERROR writing to socket"); 
} 

를 포크() 호출 후, 두 프로세스가 될 것입니다.

부모 프로세스의 경우 else 부분은 true를 유지하므로 newsockfd를 닫습니다. 그러나 newsockfd는 dostuff 메소드에서 읽기 및 쓰기 시스템 호출을 위해 자식 프로세스에 의해 사용됩니다. 이 경우 읽기 및 쓰기 시스템 호출에 실패하지 않습니까?

+0

아이는'exit (0)'을 호출하지 말고'_exit (0)'을 호출해야합니다. 그렇지 않으면, 당신은'fork'에 대한 호출에서 두 번 존재했던 모든 스트림을 플러시합니다. 이 예제에서는 중요하지 않지만 더 현실적인 경우에는 좋은 예를 설정합니다. –

+0

'fork()'가 반환되면 두 프로세스가 분리됩니다. 그들은 같은 열린 파일 기술을 가리키는 기술 어의 사본을 가지고있다. 한 프로세스에서 close가 다른 프로세스에 영향을 미치지는 않습니다 (다른 프로세스를 열린 파일 설명의 유일한 소유자로 만드는 것 이상). 파일 기술자와 열린 파일 기술을 구별하는 방법은 [POSIX'open()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/openat.html)을 참고하십시오. 'dup2()','fork()'등 –

답변

7

아니요. fork 동안 열린 모든 파일 설명자가 복사되고 동일한 설명자가 아니기 때문에 동일한 파일을 가리키기 때문입니다. fork(2) manpage에서

:

아이는 열린 파일 기술자의 부모의 세트의 사본을 상속합니다. 하위 파일의 각 파일 설명자는 에있는 해당 파일 설명자와 동일한 열기 파일 설명 (open (2) 참조)을 참조합니다. 즉, 두 개의 디스크립터는 열린 파일 상태 플래그, 현재 파일 오프셋 및 신호 구동 I/O 속성을 공유합니다 (fcntl (2)의 F_SETOWN 및 F_SETSIG에 대한 설명 참조).

+4

'close'는 통신 끝점에 대한 마지막 참조를 닫을 때만 통신 끝점을 종료합니다. 이 경우, 다른 프로세스는 해당 엔드 포인트에 대한 참조도 보유합니다. 그래서'close'는 그 프로세스의 참조만을 해제합니다. –

+0

http://www.cs.rpi.edu/~moorthy/Courses/os98/Pgms/socket.html – IanNorton

+0

하위 프로세스에 newsockfd 사본이 있다는 것에 동의했습니다. 그러나 부모 프로세스와 자식 프로세스의 newsockfd는 동일한 클라이언트 소켓을 가리키고 있습니다. 따라서 상위 프로세스가이를 종료합니다. 내가 여기서 뭔가를 놓치고 있니? – webgenius

2

하위 프로세스는 고유 한 새로운 'newsockfd'를 자체 메모리에 갖습니다. 거기에있는 소켓 핸들은 닫히고있는 부모의 'newsockfd'와 공통점이 없습니다.

+0

클로저 시점까지 두 파일 설명 자 세트는 동일한 열린 파일 설명을 공유합니다 (즉, 공통된 내용을 가지며 각 프로세스의 번호도 같음).하지만 한 파일에서 파일이 닫히는 것이 옳습니다. 프로세스는 다른 프로세스의 해당 파일 설명 자에 영향을 미치지 않습니다. –

관련 문제