[C] 데몬프로세스 만들기

#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


안녕하세요 테스트 입니다.

One thought on “[C] 데몬프로세스 만들기

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다