select 에러 질문

vilinux의 이미지

질문 무지하게 많이 하네요 ^^;

select failed : Interrupted system call

이게 왜 날까요??
Tcp 연결이 안된경우 알람 발생시켜 재접속 시도하고..
셀렉함수는 따른일 하거든요...
근데 알람 해제나 알람 타임 아웃 걸릴때 저 메세지가 뜨거든요..
알람 하고 timeval 하고 무슨 시간적인 무슨관계가 있는징.?

lovemyin의 이미지

지금 올리신 내용으로는 파악하기 힘드네요...
좀더 자세한 내용을 올리심이....어떨런지....

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

최종호의 이미지

"slow" system call 들은 기본적으로 그렇게 동작합니다.
APUE(Stevens, Advanced Programming in the Unix Environment) 10.5 절에 관련 내용이 나와있습니다.

간단히 옮기자면, slow system call 은 영원히 block될 수 있는 system call들이며,
이 녀석들이 수행중에 인터럽트가 발생했다는 것은, 무언가 이 녀석들을 깨워야 할 상황이 일어났을 수도 있다는 것입니다.
이런 경우에는 해당 system call이 깨어나면서 보통 -1을 리턴하고 errno가 EINTR 이 되지요.

보통은 두가지 방식으로 이 상황을 처리하는데,

대부분의 경우에는 해당 인터럽트가 자신과 상관없는 경우가 많기 때문에
-1 이 리턴되는 경우 errno가 EINTR라면 다시 해당 system call을 수행하도록 하는 것이고요,

또 한가지는 시그널에 의해서 system call이 인터럽트 되더라도
자동적으로 계속 수행되도록(즉, 사용자에게 -1/EINTR을 리턴하지 않고 계속 수행(블록))
시그널 처리를 변경해 주는 것입니다.
이는 sigaction의 SA_RESTART 옵션을 지정해 주는 것입니다.
이에 대해서는 APUE의 12.5 절에서 보실 수 있습니다.

vilinux 님께서는 아마 alarm 을 통해서 connect 에 타임아웃을 거신 것같고,
별도의 스레드로 select를 수행하신 것 같은데,
alram의 경우는 SIGARLM 시그널이 발생되며 이것에 의해서 select 호출이
interrupt된 것 같습니다.

connect 의 타임아웃 방식을 alarm()을 이용하는 방식이 아니라
non-block과 select 를 이용하는 방식으로 변경하시는 것이 좋을 듯 싶습니다.
참고로 select()는 multi-thread safe 합니다.

vilinux의 이미지

감사합니당 ..

ulra의 이미지

최종호님의 글중에서

Quote:

대부분의 경우에는 해당 인터럽트가 자신과 상관없는 경우가 많기 때문에
-1 이 리턴되는 경우 errno가 EINTR라면 다시 해당 system call을 수행하도록 하는 것이고요

어떻게 하면 해당 system call을 다시 수행시킬수 있나요?

OTL 즐!!!! (좌절 금지!!!)

맹고이의 이미지

ulra wrote:
최종호님의 글중에서

Quote:

대부분의 경우에는 해당 인터럽트가 자신과 상관없는 경우가 많기 때문에
-1 이 리턴되는 경우 errno가 EINTR라면 다시 해당 system call을 수행하도록 하는 것이고요

어떻게 하면 해당 system call을 다시 수행시킬수 있나요?

말그대로 리턴 값이 -1 일 때 errno 값이 EINTR 이면 다시 실행되게 하면 됩니다.
그리고 sigaction 함수에서 SA_RESTART flag를 설정하는 방법도 있었던 것 같네요.

p.s. 적고보니 최종호님 말씀을 되풀이 했네요. -_-;

ulra의 이미지

그 옵션은 제가 지정해봤습니다.
하지만 무엇때문인지 몰라도 같은 현상이 일어났습니다.
그래서 다른 방법을 알아보고 있는 중에 시스템 콜을 다시 부르는방법이
있어서 질문하게 된 것입니다.

다시 실행한다는 얘기는 select 함수를 다시 실행하라는 말인가요?

OTL 즐!!!! (좌절 금지!!!)

thisnome의 이미지

이 답변을 원하시는 건가요?


again:
if((nsel = select(maxfd + 1, &rset, NULL, NULL, NULL)) < 0)
                {
                        if(errno = EINTR)
                        {
                                Trace("select() : EINTR\n");
                                goto again;
                        }

                        Tracef("select() : error(%d)", errno);
                        exit(0);
                }


                if(FD_ISSET(...))
                {
최종호의 이미지

thisnome wrote:
이 답변을 원하시는 건가요?


again:
if((nsel = select(maxfd + 1, &rset, NULL, NULL, NULL)) < 0)
                {
                        if(errno = EINTR)
                        {
                                Trace("select() : EINTR\n");
                                goto again;
                        }

                        Tracef("select() : error(%d)", errno);
                        exit(0);
                }


                if(FD_ISSET(...))
                {

네... :oops:

혹시 타임아웃이 있는 것이면 시간 좀 조정해 주고,
goto를 싫어하신다면 다른 제어구문을 사용해도 되겠지만,
결국은 다시 똑같은 것 부르는 것이죠.. ㅡ.ㅡ

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.