| [ CnUnix ] in KIDS 글 쓴 이(By): HellCat (Nobody) 날 짜 (Date): 2003년 3월 12일 수요일 오전 01시 47분 29초 제 목(Title): Re: [Q] Signal Handler 에서 Bus Error.. 제 경우는 대게 ASYNC IO 를 SIGIO 하고 많이 쓰는데요 그게 그냥 편해서.. 어쨌던.. 일단 대충 구조는 void sig_term (int sig) { /* 만약 signal () 을 쓰면 signal 을 ignore 해줘야 하구요..*/ /* sigset 을 쓰면 자동으로 handler 시작전에 signal mask 가 되니 * /* 아무것도 안해도 되구요.. - use sigset() whenever possible*/ kill_all_children (); ... } 그리고 제경우는 SIGCHLD 왼만해서 쓰지 않아요. 뭐 대충 sigset (SIGTERM, sig_term); sigset (SIGPIPE, sig_term); sigset (SIGINT, sig_term); ... 그리고.. while (1) { sockfd = accept (..); .... error check ... if ((child = fork()) == -1) { close (sockfd); /* this can be critical error - so exit?? */ /* or maybe you should maintain accept'ed client counter */ /* so that you can limit # of children */ ... } if (child == 0) { /* close all other unnecessary FDs including listening sockets ..*/ /* then, set all the signal handler to DEFAULT!*/ /* 다시 말해서 자동으로 parent process 한테 물려 받은 것 없애주기.*/ ... do some work here .. shutdown (sockfd, 2); /* maybe need some linger option when socket was created ? or put some sleep() delay here? */ exit (0); /* so that parent can check the return code */ } /* Now parent */ while ((pid = wait (&w)) > 0) { /* some process terminated */ ... check the value of 'w' and see if it was clean exit or error exit? } if (pid == -1 && errno == EINTR) { /* this shouldn't happen unless the expected signals were received such as SIGTERM, SIGINT... etc.. */ .. so probably ready to shutdown or break out of the loop? } if (pid == -1 && errno == ECHILD) { /* No children and notthing to do ..*/ } } 이거 그냥 온라인으로 키즈 에디터로 생각나는 대로 썼더니 뭐 줄도 잘 않맞고 하여간 대충 알아서 보세요:) 그리고 ASYNC socket 쓰면 훨씬 편해지고 더 효율적이 되지요. 예를 들면 wait() 가 애들 없다고 ECHILD errno 줄때 pause(); 같은거 걸어놓고 쉴수 있으니까요. |