습관처럼 썻던 fork에 질문을 드립니다..
글쓴이: shean0 / 작성시간: 수, 2003/01/29 - 9:36오전
int main(int argc,char *argv[]) { if((server_fd=socket(PF_INET, SOCK_STREAM, 0)) <0) .. while(1) { if( (client_fd=accept(server_fd,(struct sockaddr *)&client_addr,&cli_len)) < 0 )... if((pid=fork())>0)/*parents*/ { close(client_fd); /* 이것을 해도 되는 이유가??*/ .. continue; } else { close(server_fd); call_child_main(client_fd); close(client_fd); exit(1); } } }
이런식으로 짯었는데... fork이후에 부모가 client_fd를 close하는데..물론
fork되었으니, 다른 프로세스여서 괞찮다고 생각하고 있었습니다..
그런데.. 요즘 close때문에 고민을 하다보니...
여기 부모에서 close(client_fd)를 하면, client와의 연결이 끊어지지 않는가??
왜..라는 의문이 들어서 지금 다시 책을 보고 있습니다...
조언을 부탁드립니다..
Forums:
파일 참조 계수기에 대한 내용입니다.
최초 파일 디스크립터(이하 fd)를 획득하면 해당 프로세스에서 이 fd대한 참조 개수기 카운터가 1이 됩니다.
물론 일반적인 프로그램에서 이렇게 됩니다.
하지만 fork를 통한 프로세스 복제를 하면 새로운 자식 프로세스와 기존의 어미 프로세스로 분할이 되지요..
이러면서, 모든 열려 있는 fd에 대한 참조개수기 값(이 fd를 참조 하고 있는 프로세스의 갯수)이 +1 증가 하게 됩니다.
그래서, 일반적으로 fork 후 이 참조 개수기 값을 -1 시키기 위해 어미 프로세스에서는 close를 호출하게 됩니다..
그럼 참조 개수기가 1이 되면서...
클라이언트에서 해당 fd를 사용하고 있다가. close를 호출하면 다시 참조 개수기 값이 0이 되면서 정상적인 close 루틴이 수행 됩니다.
즉 참조 하고 있는 것 만큼 close를 콜해서 참조 개수기 값이 0이 되어야
실제 close가 된다는 것입니다..
즉, 참조 개수기 값을 감소 시키기 위해.. 어미 프로세스에서 fork 후 close를 호출하는 것입니다.
사족으로, shutdown함수를 사용할 경우 참조 개수기 값과는 무관하게
close에 관련된 루틴이 실행 됩니다.
즉 참조 개수기 값이 1보다 큰값이라고 할지라도 shutdown(2);(양방향 닫기)를 호출하면 참조개수기 값에 상관없이 해당 fd를 닫습니다.
^^ 신바람 꺽이왕자~~~~
이런 형태의 iterative (반복형) 서버에서는 반드시 클로즈를 해야
이런 형태의 iterative (반복형) 서버에서는 반드시 클로즈를 해야됩니다. 안하고 서버를 계속 돌리게 되면 금방 문제가 보일텐데 그 이유는 부모프로세스의 화일테이블이 꽉 차서 더 이상 fd 를 생성할 수가 없기 때문입니다. stdio.h 의 OPEN_FILE_MAX 비슷한 이름에 대해서 공부를 ...
댓글 달기