| [ 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' |