unix domain socket에서 RTS(Real Time Signal)사용시...
프로세스 A fd[0]================fd[1] 프로세스B
|
| fd1 : 10 -------------------------> fd2 : 6
|
|
|
|
client
이렇게 Unix Domain Socket을 사용하여 연결을 하였습니다.
클라이언트는 처음에는 A로 접속하면 fd[0]를 이용하여 fd[1]으로 fd(클러아언트와 연결된 socket descriptor)를 넘깁니다.
확인된 내용은 프로세스B에서 받은 fd를 이용하여 client와 소켓통신이 가능하다는 것입니다. 이부분을 여러 사용자로 부터 받아들여야 하기 때문에 프로세스B에서 RTS(Real Time Signal)을 사용하여 접속된 클라이언트중 어떤 클라이언트에서 데이타를 전송하였는지를 알아내도록 하였습니다. (일반적으로는 select를 사용하나 접속자가 많은 경우를 대비하여 RTS를 이용하였습니다.)
그런데 RTS에서 데이타를 송신한 클라이언트에 대한 signal을 받는데 까지는 정확히 이루지는데 signal이 발생한 fd르부터 read가 되지 않습니다.
제 생각엔 unix domain socket을 이용하여 프로세스간 fd를 전송하는 것까지는 정상적으로 이루어 지지만 그 받은 fd를 RTS와 같이 이용하는 도중에 문제가 생긴듯합니다. 혹시나 해서 RTS만 따로 분리해 (unix domain socket을 이용하지 않고 데이타를 전송한 client로부터 데이타를 읽어들임) 보았는데 정상적으로 동작하였습니다.
잠정적인 결론은 Unix Domain Socket과 RTS를 같이 사용하는 경우에 문제가 있는듯 합니다.
아래는 RTS관련 소스입니다.
/------------- 소스 입니다.-------------/
while(1)
{
rtn = sigwaitinfo(&set, &si);
if(rtn = SIGRTMIN)
{
resockfd = si.si_fd;
_debug(_fl, "si.si_fd[%d]\n", si.si_fd);
if(resockfd == sockfd)
{
/*------------------------------------------------------*/
/* main_process에서 sendmsg한 fd값을 얻는다. */
/*------------------------------------------------------*/
newsd = recv_fd(sockfd);
if(newsd < 0)
{
_debug(_fl, "recv_fd failed error[%d]___sockfd[%d]\n",
newsd, sockfd);
break;
}
else
_debug(_fl, "RECV_FD SUCCESS FD=[%d]~~~\n", newsd);
setup_sigio(newsd);
_debug(_fl, "newsd=[%d]\n", newsd);
}
else
{
/*------------------------------------------------------*/
/* FD get Data */
/*------------------------------------------------------*/
memset(&message, 0x00, SZ_MESSAGE);
if(read(resockfd, &message, SZ_MESSAGE) <= 0) <===== 이 부분 문제~!
{
_debug(_fl, "fd_read disconnect \n");
continue;
}
_debug(_fl, "signal____[%.2s][%.16s/%.10s][%c][%c]\n",
message.option, message.user_id,
message.user_name, message.user_sex,
message.categorize1);
}
}
}
/---------------------------------------------------------------------/
혹 Unix Domain Socket과 Real Time Signal이 함께 쓸수 없는건가요?
아님 소스에 어떤 문제가 있는 것일까요?
*개발환경
운영체제: Linux kernel 2.4.18
컴파일러: gcc version 3.2
첨부 | 파일 크기 |
---|---|
질문.txt | 2.4 KB |
댓글 달기