unix domain socket에서 RTS(Real Time Signal)사용시...

yurina의 이미지

프로세스 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

File attachments: 
첨부파일 크기
Plain text icon 질문.txt2.4 KB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.