| [ 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() 해도 되고.. |