CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): zeo (ZeoDtr)
날 짜 (Date): 2002년 4월 25일 목요일 오후 06시 29분 10초
제 목(Title): Re: sigchld 질문 


옛날에 제가 만들었던 code에 다음과 같은 부분이 있네요.
(HylaFAX라는 유명 공짜 소프트웨어에서 따온 것 같음.)
몇 년을 잘 돌고 있는 code이므로, 아래 comment를 믿으셔도 될 듯.
unix world를 떠난 지 꽤 돼서 기억이 잘 안 나지만... 적어도
SIGCHLD/SIGCLD handler가 수행 중에는 SIGCHLD/SIGCLD handler에 
re-entrance가 일어나지는 않는다는 얘기.
...혹시 waitpid를 loop 돌면서 하는 게 key point가 아닐까요?

아, 그리고, SIGCHLD/SIGCLD를 받는 대신 child process가 message
queue나 pipe 같은 데 자기 죽는다고 쓰게 하는 건 child process를
-9로 kill해 버렸을 때 꼬일 우려가 있으므로, 개인적으로는 별로
추천하고 싶지 않군요.

---

//
// SIGCHLD/SIGCLD signal handler
//
// 당연하지만, 이 signal handler 내에서는 SIGCHLD/SIGCLD가 다시
// deliver되지 않으므로, 안심하고 linked list를 다루는 function을
// call할 수 있다. (unreliable signal의 경우는 signal이 deliver될
// 때 signal handler 정보가 reset되기 때문에 안전하고, POSIX
// signal의 경우는 자동으로 SIGCHLD가 mask 되므로 안전하다.)
//
void
#if XCONFIG_PosixSignal
XXX::sigCHLD(...)
#else
XXX::sigCLD(int)
#endif
{
pollChild();
}

void
XXX::pollChild()
{
pid_t pid;
int status;

while((pid = waitpid(-1, &status, WNOHANG)) > 0)
sm_childWaitQueue->childTerminated(pid, status);
}

---
ZZZZZ             "Why are they trying to kill me?"
  zZ  eeee  ooo   "Because they don't know you are already dead."
 zZ   Eeee O  O
ZZZZZ Eeee OOO        - Devil Doll, 'The Girl Who Was...Death'
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.