데몬(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; } |
[참조] 리눅스 시스템 프로그래밍 - 로버트 러브 지음