프로세스에 대해...

zombie007의 이미지

안녕하세요..
fork 한후 자식 프로세스가 죽으면 다시 실행하는 것을 구현 해봤는데여..
signalhandle가 한번 밖에 호출 되질 않습니다...
어떤 이유때문인지 궁금합니다...
고수님들의 조언 부탁드립니다..

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

static void signalhandle(int arg);
void child_stop();
int main()
{
        pid_t pid;
        int status;

        signal(SIGCHLD, signalhandle);

        /*parent process*/
        if((pid = fork()) > 0)
        {
                wait(&status);
        }
        /*child process*/
        else if(pid == 0)
        {
                child_stop();
        }
}

void signalhandle(int arg)
{
        pid_t pid;

        printf(" signalhandle \n");

        if((pid = fork()) == 0)
        {
                child_stop();
        }
}

void child_stop()
{
        printf(" child_stop() \n");
        sleep(10);
        exit(-1);
}

cinsk의 이미지

man sigaction(2), use POSIX signal handling function.

beta의 이미지

signal 을 받을 parent process 가 종료되고 있습니다.
아래 방법이 하고자 하시는 일에 맞는지 모르겠으나, 아래처럼 해결은 가능합니다.

        ....
        /*parent process*/
        if((pid = fork()) > 0)
        {
               while( wait(&status) ) ;
        }

발 담갔다. 이제 익숙해 지는길만이..

pynoos의 이미지

전통적인 handler 등록함수는 SIGCHLD에 대해 한 번의 호출만 되도록 합니다. 즉, handler 가 reset되는 것입니다.

cinsk 님이 권하시는대로 sigaction을 사용하여 reset이 되지 않도록 default option을 없애고 등록하시던지,

sigchld handler 안에 서 재등록하도록하는 것이 해결책입니다.
재등록하는 방법은 별로 권하고 싶지 않군요.