프로그래밍/네트워크 프로그래밍

[예제] 데몬(daemon) 작성

투칼론 2016. 4. 3. 15:35
반응형

데몬(Daemon)이란?


백그라운드에서 수행되며 제어 터미널이 없는 프로세스다. 데몬은 반드시 init 프로세스의 자식 프로세스여야 하고, 터미널과 연결되어 있으면 안된다.

참고로, 데몬은 물리학자 제임스 클러크 멕스웰의 사고실험인 멕스웰의 도깨비에서 차용했다고 함




데몬 생성 로직


1

 fork()를 호출해서 데몬이 될 새로운 프로세스 생성한다.

2

 부모 프로세스에서 exit()를 호출해서 데몬 프로세스의 부모 프로세스를 종료한다.

3

 setsid()를 호출하여 데몬이 새로운 프로세스 그룹과 세션의 리더가 되도록 한다.

4

 chdir()를 호출하여 작업 디렉토리를 루트 디렉토리로 변경한다.

5

 모든 파일 디스크립터를 닫는다.

6

 0, 1, 2번 파일 디스크립터(각각 표준 입력stdin, 출력stdout, 에러stderr)를 열고 /dev/null로 리다이렉트 한다.




데몬 예제 소스


#include <sys/types.h>

#include <sys/stat.h>

#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>

#include <unistd.h>

#include <linux/limits.h>

nt main(void)

{

        pid_t pid;

        int i;


      /* 새로운 프로세스 생성 */

        pid = fork();

        if (pid == -1)

                return -1;

        else if (pid != 0)

                exit(EXIT_SUCCESS);


      /* 새로운 세션과 프로세스 그룹을 생성, 세션 리더로 만듬 */

        if (setsid() == -1)

                return -1;


      /* 작업 디렉토리를 루트 디렉토리로 변경 */

        if (chdir("/") == -1)

                return -1;


      /* 모든 파일 디스크립터(fd)를 닫음 */

        for (i=0; i<NR_OPEN; i++)

                close(i);


      /* 표준 입력, 출력, 에러 파일을 /dev/null 로 리다이렉션 */

        open("/dev/null", O_RDWR);

        dup(0);

        dup(0);


      /* 데몬에서 수행할 작업... */

        return 0;
}



[참조] 리눅스 시스템 프로그래밍 - 로버트 러브 지음