#include <sys/types.h>#include <sys/stat.h> #include <stdio.h> #include <fcntl.h> int main() { pid_t pid; // 첫번째 fork 를 실행한다. if (( pid = fork()) < 0) return -1; else if ( pid != 0) exit(0); // child 생성후 parent 종료, 백그라운드 실행시점. child 만 이하를실행한다. // 세션을 생성한다. 세션 리더로 만든다. (세션 : 쉽게말해 프로세스의 작업공간) // fork 로 생성된 child process 를 현재세션과 무관하게 동작하도록 한다. setsid(); // SIGHUP 시그널을 무시한다. // 데몬프로세스는 터미널과 연결되지 않으므로, // SIGHUP 시그널을 수신하더라도 중지하지 않아야한다. signal(SIGHUP, SIG_IGN); // 두번째 fork 를 실행한다. 자식 프로세스를 만든다. if ((pid = fork()) != 0) exit(0); / * 부모 프로세스는 종료 시킨다. */ chdir("/"); /* 디렉토리 변경 */ // 데몬프로세스는 표준출력stdout(1)/표준에러stderr(2)/표준입력stdin(0)이 없으므로, // 관련fd 를 닫는다. for (fd = 0; fd < 3; fd++) close(fd); umask(0); // 데몬 프로그램이 실행할 코드를 작성한다. while(1) { } } /* 자신을 데몬으로 만드는 코드 */ /** child 생성후 parent 종료, 백그라운드 실행시점 **/ if ((pid = fork()) != 0) exit(0); /* 부모 프로세스는 종료 시킨다. 즉, 자식 프로세스만 아래 부분을 실행한다. */ setsid(); /* 세션 리더로 만든다.세션 : 쉽게말해 프로세스의 작업공간 fork 로 생성된 child process 를 현재세션과 무관하게 동작하도록 한다. 새로운 하나의 세션을 만들고, 세션리더가 된다. 또한 새로운 세션을 그룹을 만들고 그룹의 리더가된다. setsid 를 호출하여 새롭게 만든 세션은 제어터미널을 가지고 있지 않다. 이미 프로세스의 그룹리더인 프로세스는 호출할 수 없다. */ // 데몬 프로세스는 터미널과 연결되지 않으므로, // SIGHUP 시그널을 수신하더라도 중지하지 않아야한다. signal(SIGHUP, SIG_IGN); /* SIGHUP 시그널을 무시한다. */ // 두번째 fork 를 실행한다. if ((pid = fork()) != 0) /* 다시 자식 프로세스(손자)를 만든다. */ exit(0); / * 부모 프로세스는 종료 시킨다. */ chdir("/"); /* 디렉토리 변경 */ umask(0); // 데몬프로세스는 표준출력/표준에러/표준입력이 없으므로 fd(1,2,0) 를 닫는다. for (i = 0; i < MAXFD; i++) close(i); /* 혹시 개설되어 있을지 모르는 소켓을 닫는다. */ //데몬으로 만들어준다. int daemon_init(void) { pid_t pid; int fd; if ((pid = fork()) < 0) return (-1); else if (pid != 0) exit(0); setsid(); chdir("/"); fd = open ("dev/null", O_RDWR); dup2(fd, 1); dup2(fd, 2); dup2(fd, 0); close(fd); umask(0); return(0); }
기타 다른 사례들
1.포크기반 데몬프로세스
2.쉘스크립트를 이용한 데몬프로세스
3. 셈플3
< 또다른 방법을 소개합니다. >
- test 1
- test 2
- test 3
안녕하세요 테스트 입니다.
good job