멀티프로세스 소켓통신 기반 서버 코딩중 문제입니다...
안녕하세요.
매일 글만 읽다가 처음으로 질문 사항을 올려봅니다.
지금 개발중인 게이트웨이 프로그램의 개략적인 구조는 다음과 같습니다
-------------------------------------------------------------------------
1. 소켓 리스닝
2. tcp accept후 차일드 생성
3. 해당 차일드가 전문 파싱 및 분석하여 요청에 해당하는 비지니스 로직 프로세스의
IPC 메시지 큐에 송신
4. 게이트웨이 자신의 메시지큐를 바라보며 메시지 오기를 대기
(alarm 시그널을 통해 30초 대기 후 타임아웃)
5. 클라이언트에 응답 송신후 소켓 close, 차일드 끝
※ 특징
1. 메시지큐를 프로세스간 메일함처럼 이용 중
2. 소켓통신함수는 기본적으로 select()를 이용하고있음
-------------------------------------------------------------------------
문제점은
멀티프로세싱 테스트를 위해 일부러 비지니스 프로세스를 죽여 놓고 테스트를 하였는데
두 개의 요청을 연달아 보냈을 경우,
하나의 큐 응답 대기가 타임아웃이 나기 전까지 다음 요청이 처리되지 않습니다.
자세히 설명드리면,
중간중간 printf로 상황을 체크하면 tcp accept후 차일드는 계속 만들어졌다가
사라지고를 반복하는데, 정작 두번째 요청은 처리하지 못한다는데 있습니다.
ps -ef | grep (게이트웨이명) 으로 확인을 해도 큐 응답 대기일때만
2개(parent 1개, child 1개)가 떠있고 이 상태에서 또 클라이언트 요청이 있으면
child가 더 만들어지지 않고 단일 프로세스처럼 처리가 된다는 뜻입니다.
대체 왜 그런걸까요.. 너무 답답해서 여기에 질문을 올립니다.
개략적인 코드 내용
메인의 주된 부분
while ( 1 ) { new_fd = TcpAccept(fd); if ( new_fd < 0 ) { if(errno == EINTR) { close( new_fd ); continue; } else { exit(1); } } childpid = fork(); if(childpid == 0) { close(fd); runchild(new_fd); exit(0); } close( new_fd ); }
runchild 함수 개요
1. new_fd를 통해 전문 recv()
2. 해당 비지니스 프로세스의 메시지큐(메일함)으로 전송
3. 게이트웨이 메시지큐 응답 대기
4. 클라이언트로 송신
5. close(new_fd)
※ 큐통신은 mtype를 활용하여 잘 이루어지므로 문제가 아닌것 같습니다.
고수님들의 조언 부탁드립니다.
댓글 달기