소켓기술자를 다른 프로세스로 전달하는 방법에 관한 질문입니다.
글쓴이: trymp / 작성시간: 목, 2009/09/10 - 10:48오후
제가 리눅스 소켓 프로그래밍을 공부하고 있는데요.
서버프로그램이 클라이언트 소켓 기술자를 자식프로세스에 보내줄 때 dup() 나
기타 다른 방법을 사용한다고 들었습니다.
자식 프로세스가 아닌 완전히 다른 프로세스에 대해서는 sendmsg(), recvmsg()를
이용한다고 들었습니다.
이것도 control message 에 넣어서 sockfd 값을 보내주는 걸로 아는데요.
이렇게 전달해 줄거면 차라리 제어데이터 같은 것 안쓰고 그냥 공유메모리 같은
IPC를 이용하면 되지 않나요. 도메인소켓에 제어데이터를 넣어주면서 까지
이런 방법을 사용해야 하는지 의문입니다. 그 socket FD 의 정수값이 바뀔 것
같지도 않구요.
고수님들의 조언 부탁드립니다.
Forums:
descriptor table은 커널
descriptor table은 커널 영역에 있고, 프로세스별로 관리됩니다.
유저모드에서는 단순히 current 프로세스의 table index 만 가져다 사용할 뿐입니다.
번호는 바뀔 수도 있고 바뀌지 않을 수도 있습니다.
커널 소스 중 net/core/scm.c , include/net/scm.h 를 보세요.
(http://lxr.linux.no/linux 를 이용하면 코드 추적이 쉽습니다)
OTL
과거에는 상대적으로
과거에는 상대적으로 메모리의 코스트가 높았기 때문에 IPC비용을 최대한 줄일려고 했습니다.
그래서 서로 다른 프로세스에게 데이터를 전달하기보다 fd를 전달하는 것도 하나의 방법이었지요.
현재는 fd를 전달하는 방법은 거의 사용하지 않고 있습니다.
더군다나 복수개의 프로세스로 모듈화 하여 데이터를 복제한다든지 할때는 IPC가 훨씬 효용성이 높기 때문입니다.
IPC도 비용대비 쓰레드를 사용하는 방법에 비해서 좋지 않아서 멀티쓰레딩 환경으로 가는 판국이니까요.
(그래도 여전히 IPC는 아주 매력적인 통신방법입니다)
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.
========================================
* The truth will set you free.
댓글 달기