IT_Programming/System Programming

[Linux] 데몬 프로세스 만들기

JJun ™ 2008. 1. 25. 10:58

1. background로  수행되도록 한다.
    - fork()를 호출하여 parent를 종료한다.
    - child 프로세스는 프로세스 그룹의 리더가 아니다.
    if(fork()>0)
        exit(0);

2. 새로운 세션을 생성한다.
    - 세션의 리더가 된다.
    - 제어 터미널과 단절된다.
    setsid();
3. 열려진 모든 file descriptor를 닫는다.
    - daemon을 실행시킨 프로세스로 부터 상속받은 모든 fd를 닫는다.
       for(I=0;I<64;I++)
           close(I);
4. 작업 디렉토리를 root로 바꾼다.
    - mount된 파일 시스템을 unmount 가능하도록 하기 위해
       chdir(“/”);
5. 파일 생성 마스크를 제거한다.
    - parent(자기를 기동한 프로세스)로 부터 물려받은 umask를 제거
       umask(0);
6. SIGCLD 시그널을 처리한다.
    - 자식이 발생하는 SIGCLD를 대응 하지 않으면 zombie가 된다.
       signal(SIGCLD,SIG_IGN);

 

=================================================================================

 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

int daemon_init(void)
{
        pid_t   pid;
        int i;

        if(fork() > 0)
             exit(0);

        /* child continues */
        setsid();               /* become session leader */

        chdir("/");             /* change working directory */

        umask(0);               /* clear our file mode creation mask */

        for(i=0;i<64;i++)
            close(i);

        signal(SIGCLD,SIG_IGN);
 
        return(0);
}

main(void)
{
        daemon_init();
        sleep(20);
}