:: 세상의 중심 ::

※ 데몬 프로그램과  백그라운드 프로그램의 차이
일반적인 백그라운드 프로그램은 터미널을 가지지만, 데몬 프로그램은 터미널을 가지지 않는다.
왜냐하면 보통 데몬프로그램은 특별한 일이 없는한 사용자와 상호대화할 필요 없이 아무도 모르게 실행되어야 하기 때문이다.
또한 모든 데몬 프로그램은 PPID 즉 부모 프로세스가 1번으로 세팅되며, 이는 데몬 프로그램의 관리프로세스는 1번 pid 를 가지는 init 가 담당함을 의미한다.

※ 데몬 프로그램 제작 : 데몬프로세스는 아래의 3가지 조건만 만족시켜주면 된다.

  1. 우선 fork 를 호출해서 자식프로세스를 생성시킨 다음 부모프로세스를 종료시킨다.
    기본적으로 부모프로세스가 자식프로세스를 fork 했을경우 해당 자식프로세스의 PPID 는 부모프로세스의 ID 가된다. 그런데 자식이 죽기전에 부모프로세스가 죽어버리면 자식프로세스의 PPID는 (다시말해서 자식프로세스의 소유 프로세스) 누가될까 ?
    부모 프로세스는 이미 죽었음으로 PPID가 될수 없을것이다.
    이럴 경우 자동적으로 자식프로세스의 관리 프로세스는 PID 1 번인 init이 담당하게 된다.
  2. setsid 를 이용하여 새로운 세션을 만들고, 현재프로세스(자식)의 PID가 세션의 제어권을 가지도록 한다.
    setsid 는 새로운 세션을 생성하기 위해서 사용한다. 보통 세션은 자신의 세션을 위한 tty 를 가져야 되는데, 새로운 세션을 생성하면 여기에 tty 를 부여해 주어야 한다. 그렇지 않게 될경우 터미널을 가지지 않은 세션이 생성되게 된다. 간단히 생각해서 세션이란 프로그램 그룹의 모음라고 할 수 있다.
    어쨋든 이렇게 해서 프로세스는 자신만의 독자적인 길을 걷게 된다.
  3. chdir 을 이용하여 프로세스가 루트디렉토리에서 작업을 수행하도록 변경시켜준다.
    이것은 선택사항으로 굳이 할 필요는 없으나, 데몬 프로그램에서 여러가지 파일을 읽고 쓰는 작업을 할때 상대경로를 명시함으로써 일어나는 혼동을 피하기 위해서 권장하는 방법이다.

※ 데몬 돌려본 예제 프로그램

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

int main()
{
    pid_t   pid;

    if (( pid = fork()) < 0)
        exit(0);

    // 부모프로세스를 종료한다.
    else if(pid != 0)
        exit(0);

    // 터미널 종료시 signal의 영향을 받지 않는다.
    signal(SIGHUP, SIG_IGN);
    close(0);
    close(1);
    close(2);

    chdir("/");

    // 새로운 세션의 리더가 된다.
    setsid();

    while(1)
    {
        // 여기에 프로그램 본체를 넣는다.
        sleep(1);
    }
}
Posted by bsh