본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

c언어 리눅스(linux) 데몬프로세스(daemon) 간단 예제

by 주용사 2023. 1. 8.
728x90
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>  // 자식프로세스 fork할 용도
#include <signal.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
        int pid;

        /* fork 생성 */
        pid = fork();
        printf("pid = [%d] \n", pid);

        /* fork 에러 발생 시 로그 남긴 후 종료 */
        if(pid < 0){
                printf("fork Error... : return is [%d] \n", pid );
                perror("fork error : ");
                exit(0);
        /* 부모 프로세스 로그 남긴 후 종료 */
        }else if (pid > 0){
                printf("child process : [%d] - parent process : [%d] \n", pid, getpid());
                exit(0);
        /* 정상 작동시 로그 */
        }else if(pid == 0){
                printf("process : [%d]\n", getpid());
        }

        /* 터미널 종료 시 signal의 영향을 받지 않도록 처리 */
        signal(SIGHUP, SIG_IGN);
        //close(0);
        //close(1);
        //close(2);

        /* 실행위치를 Root로 변경 */
        chdir("/");

        /* 새로운 세션 부여 */
        setsid();

        /* 표준입출력을 리다이렉션하여 데몬에서 데이터가 출력되는 것을 방지 */
        open("/dev/null", O_RDWR);
        int cnt = 0;

        /* 반복 실행이 필요한 코드면 while문 안에 삽입 */
        while(1) {
                printf("cnt = %d\n", cnt++);
                /* 5초 마다 체크 */
                sleep(5);
        }
}

명령어

ps -ef | grep testdaemon -> 프로세스 확인(pid)

kill -9 pid번호 -> 데몬프로세스 죽이는 법



그럼 데몬 프로세스를 만드는 방법을 살펴보자. 데몬 프로세스의 핵심은

1. 터미널을 가지지 않으며

2. PPID가 1인 프로세스를 만드는 것

에 있다. 이런 프로그램은 아래의 규칙을 이용해서 만들 수 있다.



1. fork 함수를 호출해서 자식프로세스를 만든다.

2. 부모 프로세스를 종료한다.

3. setsid를 이용해서 새로운 세션을 만들어서, 현재 프로세스(자식 프로세스)의 PID가 세션의 제어권을 가지게 한다.

4. chdir을 이용해서 프로세스의 작업디렉토리를 변경한다.

부모프로세스가 fork로 자식프로세스를 만들면, 자식 프로세스의 PPID는 부모프로세스의 PID가 된다. 이 상황에서 부모프로세스가 죽어버리면, 자식프로세스는 고아 프로세스가 된다. 부모프로세스가 사라졌으니 PPID는 사용 할 수 없게되고, PID 1번인 init 프로세스가 PPID가 된다.

setsid는 새로운 세션을 만들기 위해서 사용한다. 세션은 자신의 세션을 위한 tty를 가져야 하는데, 새로운 세션을 생상하면 여기에 tty를 부여해 줘야 한다. 그렇지 않을 경우 터미널을 가지지 않은 세션이 만들어진다. 이렇게 해서 PPID가 1이고 터미널을 가지지 않은 프로세스가 만들어졌다.

5번은 선택사항이다. 데몬 프로세스의 생성에는 관여하지 않지만, 데몬 프로세스가 작업할 디렉토리를 명확히 해주는게 좋을 것이다. 권장사항 같은거라고 보면 되겠다.



http://blog.freezner.com/archives/503

https://www.joinc.co.kr/w/Site/system_programing/process/daemon

728x90