SELECT 처리 도중에 시그널이 전송되면?

gnugpl의 이미지

시그널이 전송된후 SELECT를 처리하면
Interrupted system call 이 호출됩니다.

왜 이렇고?
해결방안은 무엇인지요?

감사합니다.

mach의 이미지

Quote:
시그널이 전송된후 SELECT를 처리하면

=> "select호출에서 블록된것signal이 발생하면"으로해야 맞습니다.
Quote:
Interrupted system call 이 호출됩니다.

이 얘기는 시스템호출이 인터럽트되었다는것을 의미합니다.
*모든 유닉스(리눅스) 시스템호출은 2가지 상황에서 리턴한다. 첫째, **해당연산을 완료**하면 리턴한다. (결과의 성공, 실패는 별개문제임.) 두번째로, 그러나, 해당연산이 완료되지(연산중간에도) 않아도 **시그널을 받으면** 즉시 리턴한다. 리턴할때는 에러코드를 "errno"에 세팅하고 리턴한다.

이를 테면, 다음코드를 봅시다.

char *ptr ="0123456789";
int ret;

ret= write( 1, ptr, 10); // 시스템호출

위 코드는 다음과 같이 그림으로 표현할 수 있습니다.

user program             kernel(os)
   ....                               |
 1) write  ---                         |         // 운영체제에게 출력을 요청
                  ----                |
                         -----        |
                                ----> |        // 요청이 운영체제에 도착 
                                       운영체제는 요청을 처리시작
                                        처리중
                                        처리중
                                       운영체제는 처리종료
                                       운영체제는 결과를 호출자에게 리턴
                                ----  |        // 결과가 운영체제에서 출발
                         -----        |
                   ----               |
 2)ret=  <---                          |         // 사용자프로그램에게 리턴값도착

1)write에서 2)ret까지가 write()시스템호출이 차지하는 시간입니다.그리고 다른말로 "1)~2)까지 write()에서 블록되었다"라고 말합니다. 블록되었다라는 말은 어떤 처리가 종결될때까지, 대기하고 있는것을 의미합니다. 이를테면 scanf()같은 호출은 사용자의 입력이 들어오고 엔터키가 입력될때까지 블록된다라고 말합니다.

*그럼 문제로 가서,
select()도 위와 같이 생각할 수 있습니다. select()함수(시스템호출이 더 타당)를 호출하면, 리턴이 발생하는 원인은 크게 2가지이다.
1) select()호출시 파라메터로 세팅한 조건을 만족했다.
2) signal()이 발생했다.
따라서, select()호출을 사용하면 다음과 같은 코드가 필연적으로 뒤따라야 합니다.

  ret = select(어떤조건)
  if (ret == -1 )  // select()에서 빠져나온게 에러인가?
  {
       if (errno == EINTR) //  시그널에 의해 select()를 빠져나옴
           처리; //시그널에 의해서 select()에서 블록된것이 빠져나옴
       else // select()에서 에러가 발생함, 진짜에러임
           처리;
   }
   else 
   {
      //  select()가 어떤조건에 만족하는 결과를 가지고 리턴함
    }
[/b]

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

gnugpl의 이미지

시그널은 시그널 핸들러를 통해서 전달받았습니다.
시그널 핸들러를 통해서 접수했음에도 불구하고,
select가 시그널이 발생했다는것을 어떻게 알수 있는지요?

핸들러를 통해 접수해도, 시그널은 프로세스내 I/O 입출력에 모두 영향을 끼치나요?
끼친다면 어떠한 작용을 행하는것인지요?

감사합니다.

RM -RF /bin

mach의 이미지

Quote:
시그널은 시그널 핸들러를 통해서 전달받았습니다.

구체적으로 어떤 시그널들에 대해 핸들러를 달아주셨나요?
Quote:
시그널 핸들러를 통해서 접수했음에도 불구하고,
select가 시그널이 발생했다는것을 어떻게 알수 있는지요?

님께서 작성하신 핸들러의 코드를 보여주십시요.

참고로, 테스트를 한번해보지요.
핸들러에 다음 코드를 넣어서 테스트 해보세요.

void sigHandler(int signo)
//핸들러시작
 어쩌구저쩌구;
 ....
 signal(시그널, SIG_IGN); // 이거
//핸들러끝
}
*주의 :그러나, 임의의 시그널을 함부로 매스킹하는것은 별로 좋은 습관이 아닙니다.
Quote:
핸들러를 통해 접수해도, 시그널은 프로세스내 I/O 입출력에 모두 영향을 끼치나요?
끼친다면 어떠한 작용을 행하는것인지요?

예 또는 아니요.
핸들러를 어떻게 달았냐가 관건입니다. 영향을 끼친다면 블록킹을 탈출시킨다는것이지요. 또는 9번시그널처럼 프로그램 죽여버리거나.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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