"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 합니다.
좀더 자세한 내용을...
지금 올리신 내용으로는 파악하기 힘드네요...
좀더 자세한 내용을 올리심이....어떨런지....
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
"slow" system call 들은 기본적으로 그렇게 동작합니다.
"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 합니다.
감사합니당 ..
감사합니당 ..
[질문] select 에러에 대해 질문...
최종호님의 글중에서
어떻게 하면 해당 system call을 다시 수행시킬수 있나요?
OTL 즐!!!! (좌절 금지!!!)
Re: [질문] select 에러에 대해 질문...
말그대로 리턴 값이 -1 일 때 errno 값이 EINTR 이면 다시 실행되게 하면 됩니다.
그리고 sigaction 함수에서 SA_RESTART flag를 설정하는 방법도 있었던 것 같네요.
p.s. 적고보니 최종호님 말씀을 되풀이 했네요. -_-;
답변 감사드립니다.
그 옵션은 제가 지정해봤습니다.
하지만 무엇때문인지 몰라도 같은 현상이 일어났습니다.
그래서 다른 방법을 알아보고 있는 중에 시스템 콜을 다시 부르는방법이
있어서 질문하게 된 것입니다.
다시 실행한다는 얘기는 select 함수를 다시 실행하라는 말인가요?
OTL 즐!!!! (좌절 금지!!!)
이 답변을 원하시는 건가요?[code:1]again:
이 답변을 원하시는 건가요?
[quote="thisnome"]이 답변을 원하시는 건가요?[co
네... :oops:
혹시 타임아웃이 있는 것이면 시간 좀 조정해 주고,
goto를 싫어하신다면 다른 제어구문을 사용해도 되겠지만,
결국은 다시 똑같은 것 부르는 것이죠.. ㅡ.ㅡ
댓글 달기