부모프로세스에서 SIGCHLD 를 블록 시켰는데요...
글쓴이: bird0303 / 작성시간: 수, 2005/01/26 - 9:19오후
#include <unistd.h> #include <sys/types.h> #include <signal.h> #include <errno.h> #include "ourhdr.h" int main(void) { pid_t pid; int status; sigset_t newmask, oldmask; sigemptyset(&newmask); sigaddset(&newmask, SIGCHLD); sigprocmask(SIG_BLOCK, &newmask, &oldmask); if( (pid=fork())<0 ) err_sys("fork error"); else if(pid==0) { sigprocmask(SIG_SETMASK, &oldmask, NULL); sleep(4); exit(0); }else{ while(waitpid(pid, &status, 0)<0 ) if(errno!=EINTR) { status=-1; break; } } sigprocmask(SIG_SETBLOCK, &oldmask, NULL); return (status); }
자식프로세스는 종료될때 SIGCHLD 를 부모프로세스에게 보내잖아요. 그럼 만약에 부모프로세스가 sigprocmask()를 사용해서 SIGCHLD signal 을 SIG_BLOCK 하면 부모프로스세는 waitpid()에서 signal을 못받으니까 -1을 리턴해야하지 않나요? 그런데 그냥 정상적으로 실행 되네요. 왜그럴까요??? 이해가 안되서 진도가 안나가요..ㅠㅠ
Forums:
시그널은 단순히 자식이 종료 했다는 것을 알려줍니다.wait, w
시그널은 단순히 자식이 종료 했다는 것을 알려줍니다.
wait, waitpid는 시그널의 발생 유무와는 관계없이 작동하구요.
시그널을 받아야 wait로 자식을 거두어-_- 줄 수 있는 것은 아닙니다.
soMeCan
wait, waitpid 는 자식프로세스가 좀비가 되기를 기다려며 루프속
wait, waitpid 는 자식프로세스가 좀비가 되기를 기다려며 루프속에서 sleep하다가
exit되는 자식이 있으면 깨어나서 임의의 좀비인 자식중 하나를 선택해서 그 좀비에 할당된 프로세스 자원들을 해제하지요.
자식이 없으면 에러를 리턴하구요...
댓글 달기