학교 수업을 들을 때 "데몬 프로세스"라는 단어에 대해서 많이 들어봤지만 항상 궁금했던 점은 백그라운드에서 실행하는(UI)가 없는 프로세스와 도대체 무슨 차이가 있는거지 라는 궁금증이 있었다.
위키에 나온 데몬의 정의를 살펴보면
멀티태스킹 운영 체제에서 데몬(daemon, 발음: 데이먼/'deɪmən/ 또는 디먼 /'dimən/[1])은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID가 1이며, 따라서 프로세스 트리에서 init 바로 아래에 위치한다. 데몬이 되는 방법은 일반적으로 자식 프로세스를 포크(fork)하여 생성하고 자식을 분기한 자신을 죽이면서 init이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식이다. 이러한 방법을 ‘fork off and die’라 부르기도 한다. 시스템은 시동할 때 데몬을 시작하는 경우가 많으며, 이런 데몬들은 네트워크 요청, 하드웨어 동작, 여타 프로그램에 반응하는 기능을 담당하게 된다. 그 밖에도 몇몇 리눅스에 있는 devfsd처럼 하드웨어 설정이나, cron처럼 주기적인 작업을 실행하는 등 기타 다양한 목적으로 사용된다. |
[데몬프로세스의 특징]
1. 사용자가 제어하지 않고 백그라운드에서 실행된다. (=인터페이스가없다 = tty를 갖지 않는다)
2. 부모프로세스를 갖지 않는다.(= PPID 가 1이다. PID를 1로 갖는 프로세스는 시스템 init 프로세스이다.)
부가적으로 시스템을 시작할때 함께 시작 된다, 접미사로 d를 붙인다.
아무튼 기존의 UI가 없는 프로그램과의 가장 큰 차이점은 사용자가 제어하지 않고 부모프로세스가 없다는 점이다.
따라서 위의 조건을 맞추어서 코드를 짜면 데몬 프로세스를 손 쉽게 만들 수 있다.
1번 조건인 tty를 갖지 않기 위해서는 setid()함수를 통해 세션의 리더가 된다.
2번 조건을 위해서 fork()를 통해 자식 프로세스를 만들고 부모프로세스는 종료하면 된다.
+보통 데몬은 superuser로 실행되기 때문에 부모프로세스의 umask를 따르지 않도록 하고 실행 디렉토리를 루트로 변경
예제코드
#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>int main(void){pid_t pid;if((pid=fork())<0){printf("fork failed!\n");exit(0);}else if(pid!=0)exit(0);//parent process exitchdir("/");umask(0);setsid();//make new session//implement daemon process codewhile(1){printf("daemon\n");sleep(2);}return 0;}
실행해보면 다음과 같이 PPID를 1로 갖고 TTY가 없는 프로세스가 생성 되었다.
'리눅스' 카테고리의 다른 글
__attribute__ ((visibility("default"))) 관련 (0) | 2020.09.13 |
---|---|
Unix Domain Socket (0) | 2020.04.12 |
[glib] 메인루프 (0) | 2018.03.04 |
리눅스 signal (0) | 2018.02.17 |
pthread에서 메모리 침범과 pthread_cancel (1) | 2018.01.21 |