[완료]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가 보내집니다.
댓글 달기