이 얘기는 시스템호출이 인터럽트되었다는것을 의미합니다. *모든 유닉스(리눅스) 시스템호출은 2가지 상황에서 리턴한다. 첫째, **해당연산을 완료**하면 리턴한다. (결과의 성공, 실패는 별개문제임.) 두번째로, 그러나, 해당연산이 완료되지(연산중간에도) 않아도 **시그널을 받으면** 즉시 리턴한다. 리턴할때는 에러코드를 "errno"에 세팅하고 리턴한다.
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()가 어떤조건에 만족하는 결과를 가지고 리턴함
}
답변
=> "select호출에서 블록된것이 signal이 발생하면"으로해야 맞습니다.
이 얘기는 시스템호출이 인터럽트되었다는것을 의미합니다.
*모든 유닉스(리눅스) 시스템호출은 2가지 상황에서 리턴한다. 첫째, **해당연산을 완료**하면 리턴한다. (결과의 성공, 실패는 별개문제임.) 두번째로, 그러나, 해당연산이 완료되지(연산중간에도) 않아도 **시그널을 받으면** 즉시 리턴한다. 리턴할때는 에러코드를 "errno"에 세팅하고 리턴한다.
이를 테면, 다음코드를 봅시다.
위 코드는 다음과 같이 그림으로 표현할 수 있습니다.
1)write에서 2)ret까지가 write()시스템호출이 차지하는 시간입니다.그리고 다른말로 "1)~2)까지 write()에서 블록되었다"라고 말합니다. 블록되었다라는 말은 어떤 처리가 종결될때까지, 대기하고 있는것을 의미합니다. 이를테면 scanf()같은 호출은 사용자의 입력이 들어오고 엔터키가 입력될때까지 블록된다라고 말합니다.
*그럼 문제로 가서,
[/b]select()도 위와 같이 생각할 수 있습니다. select()함수(시스템호출이 더 타당)를 호출하면, 리턴이 발생하는 원인은 크게 2가지이다.
1) select()호출시 파라메터로 세팅한 조건을 만족했다.
2) signal()이 발생했다.
따라서, select()호출을 사용하면 다음과 같은 코드가 필연적으로 뒤따라야 합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
감사합니다. 그렇다면 시그널은 어디에서 오는것인지요?
시그널은 시그널 핸들러를 통해서 전달받았습니다.
시그널 핸들러를 통해서 접수했음에도 불구하고,
select가 시그널이 발생했다는것을 어떻게 알수 있는지요?
핸들러를 통해 접수해도, 시그널은 프로세스내 I/O 입출력에 모두 영향을 끼치나요?
끼친다면 어떠한 작용을 행하는것인지요?
감사합니다.
RM -RF /bin
[quote]시그널은 시그널 핸들러를 통해서 전달받았습니다. [/quot
구체적으로 어떤 시그널들에 대해 핸들러를 달아주셨나요?
님께서 작성하신 핸들러의 코드를 보여주십시요.
참고로, 테스트를 한번해보지요.
*주의 :그러나, 임의의 시그널을 함부로 매스킹하는것은 별로 좋은 습관이 아닙니다.핸들러에 다음 코드를 넣어서 테스트 해보세요.
예 또는 아니요.
핸들러를 어떻게 달았냐가 관건입니다. 영향을 끼친다면 블록킹을 탈출시킨다는것이지요. 또는 9번시그널처럼 프로그램 죽여버리거나.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기