CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): HellCat (Nobody)
날 짜 (Date): 2003년 3월 12일 수요일 오후 11시 08분 18초
제 목(Title): Re: [Q] Signal Handler 에서 Bus Error..


써 놓고 나중에 보니 좀 설명이 부족한 것 같은데요..

제일 키 포인트가 ASYNC IO setup 을 listen socket 에 해주고
SIGIO handler 를 넣어 주고서
그 handler 는 간단하게 글로벌 flag turn-on 해주는걸로 하면 되고요.

void handle_io(int ignore)
{
  Incoming = 1;
}

어떤 경우는 아예 SIGIO handler 에서 들어오는 데이타를 모조리 다 처리해
주는 경우도 있는데요.. 제 경우는 그렇게 하지 말라고 권하고 싶군요.
그렇게 할 경우 graceful shutdown 하는게 조금 귀찮아 질 경우가
많지요.. 즉 하던거 마져 끝까지 다 하고 죽기가..예를 들어
soft error 같은 경우 그냥 다른거 계속한다던지.. 뭐 디자인 어떻게
하느냐에 따라 틀리겠지만.

하여간 위에 처럼 해놓고 while ...wait... 룹에서
return value 가 -1 이 되고 errno 가 EINTR 가 될경우에
다른 주요 시그날도 다 핸들러가 들어가 있으니
SIGIO 에서 set 해준 Incoming flag 을 체크 해주고 그게
셋 되어 있으면 accept 쪽으로 다시 iterate 하게끔 뭐 continue 해줘도
되고...

즉 다시 말해서 while (..wait..) 에서 빠져 나오게 되는 경우는
1) wait 가 -1 을 리턴하고 ECHILD 가 errno 로.. 즉 no children process to 
wait
2) SIGIO 가 들어와서 -1 리턴하고 errno == EINTR
  다시 말해 connect() request 가 들어옴.. accept() 쪽으로 프로그램 flow
  가 넘아가야 함.
3) -1 인데 errno == EINTR 이고..SIGIO 핸들러에서global flag 도
 셋 안해줬음. 다른 시그날이 들어온 경운데 이건 뭐 디자인에 따라
  graceful shutdown 으로 들어가던..config reload 를 하던..여러가지 맘대로.

그리고 SIGIO 로 connect() 들어오는 걸 detect 할 경우는 accept () 로
control 을 넘기지 말고 wait 에서 애덜 죽기 기다리던지
아님 -1 return 에 ECHILD 면 거기서 뭐 가비지 콜렉션을 하던 파일 archive
purging 을 하던 딴짓 좀 해도 되고 정 할게 없음 그냥 SIGIO 들어올때 까지
pause() 해도 되고..

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.