[완료]SIGCHLD 처리를 어디서 어떻게 해야 하는지요?
글쓴이: kkume / 작성시간: 화, 2008/12/30 - 11:32오전
p1.c
int main(int argc, char *argv[]) { pid_t pid; const char *exe_argv1[] = { "/root/work/test/tmp/p2", "/root/work/test/tmp/p3" }; const char *exe_argv2[] = { "p2", "p3" }; char argv_tmp1[128]={0}, argv_tmp2[64]={0}; int i; for (i = 0; i < 2; i++) { pid = fork(); if (pid == 0) { sprintf(argv_tmp1, "%s", exe_argv1[i]); sprintf(argv_tmp2, "%s", exe_argv2[i]); execl(argv_tmp1, argv_tmp2, 0); exit(0); } else if (pid < 0) { printf("fork failded.\n"); exit(1); } } while (1) { printf("%s: pid=[%d]\n", __FILE__, getpid()); sleep(2); } return 0; }
p2.c
int main(int argc, char *argv[]) { while (1) { printf("%s: pid=[%d]\n", __FILE__, getpid()); sleep(2); } return 0; }
p3.c
int main(int argc, char *argv[]) { while (1) { printf("%s: pid=[%d]\n", __FILE__, getpid()); sleep(2); } return 0; }
위와 같이 작성해서, p1을 실행하고 나서, 쉘에서 p2를 kill 하면 p2가 defunct 되는데요. 프로세스가 defunct가 되지 않게 하려면, SIGCHLD를 어떻게 처리 해야 하는지요?
p1에서 fork 시킨 p2, p3을 감시해야 합니다.
Forums:
p1.c 에서 처리하시면 되구요..
시그널 처리에 관하여 공부하시면 됩니다.
기본적은 틀은 이렇습니다.
void signal_handler(int signum);
int main()
{
static struct sigaction action;
action.sa_handler = signal_handler;
sigfillset(&(action.sa_mask));
sigaction(SIGCHLD, &action, NULL);
.....
.....
return 0;
}
void signal_handler(int signum)
{
/* 시그널 관련 처리로직 */
.....
.....
}
답변 감사드립니다.
답변 감사드립니다.
새해 복 많이 받으세요..
SIGCHLD는 fork된 child
SIGCHLD는 fork된 child process에 문제가 발생할 경우에 parent process에게 보내는 signal입니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
문제가 발생할때만...
문제가 발생할때만 SIGCHLD가 발생하는게 아니구요...
child process가 종료할때도 부모프로세스에게 알려주는 용도로 SIGCHLD가 보내집니다.
댓글 달기