programing

프로세스 데몬 생성 방법

kingscode 2022. 7. 11. 23:29
반응형

프로세스 데몬 생성 방법

프로그램을 데몬으로 만드는 방법을 이해하려고 합니다.그래서 내가 우연히 알게 된 몇 가지는 일반적으로 프로그램이 데몬이 되기 위해 다음 단계를 수행합니다.

  1. 불러fork( ).
  2. 부모로 콜을 합니다.exit( )이것에 의해, 원래의 부모(데몬의 조부모)는, 그 아이가 종료한 것, 데몬의 부모가 더 이상 동작하고 있지 않은 것, 및 데몬이 프로세스 그룹의 리더가 아닌 것을 만족할 수 있습니다.이 마지막 포인트는 다음 단계를 성공적으로 완료하기 위한 요건입니다.

  3. 불러setsid( )이 명령어는 데몬에 새로운 프로세스 그룹과 세션을 제공합니다.이 두 프로세스 그룹은 모두 리더로서 사용됩니다.이것에 의해, 프로세스에는 관련지어져 있는 제어 단말기가 없는 것도 보증됩니다(프로세스가 새로운 세션을 작성한 지 얼마 되지 않아 세션은 할당되지 않습니다).

  4. 작업 디렉토리를 루트 디렉토리로 변경합니다.chdir( )이는 상속된 작업 디렉토리가 파일 시스템상의 어디에나 있을 수 있기 때문입니다.데몬은 시스템 가동 시간 동안 실행되는 경향이 있기 때문에 임의의 디렉토리를 열어두고 싶지 않기 때문에 관리자가 해당 디렉토리가 포함된 파일 시스템을 마운트 해제하지 않도록 해야 합니다.

  5. 모든 파일 기술자를 닫습니다.

  6. 파일 기술자 0, 1 및 2(표준 입력, 표준 출력 및 표준 오류)를 열고 로 수정합니다./dev/null.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>

int main (void)
{
    pid_t pid;
    int i;

    /* create new process */
    pid = fork ( );  
    if (pid == -1)  
        return -1;  
    else if (pid != 0)  
        exit (EXIT_SUCCESS);  

    /* create new session and process group */  
    if (setsid ( ) == -1)  
        return -1;  

    /* set the working directory to the root directory */  
    if (chdir ("/") == -1)  
        return -1;  

    /* close all open files--NR_OPEN is overkill, but works */  
    for (i = 0; i < NR_OPEN; i++)  
        close (i);  

    /* redirect fd's 0,1,2 to /dev/null */  
    open ("/dev/null", O_RDWR);  
    /* stdin */  
    dup (0);  
    /* stdout */  
    dup (0);  
    /* stderror */  

    /* do its daemon thing... */  

    return 0;  
}

Apache와 같은 일부 프로그램의 기존 소스 코드에 대한 링크를 통해 이 과정을 좀 더 자세히 이해할 수 있을까요?

클린 어프로치를 찾고 있는 경우는, 표준 api의 사용을 검토해 주세요.int daemon(int nochdir, int noclose);맨 페이지 꽤 단순하고 자기 설명적인 맨 페이지. 맨 페이지제대로 테스트된 API는 휴대성과 안정성이라는 자체 구현 인터미어를 훨씬 능가합니다.

Linux 에서는, 다음의 방법으로 간단하게 실행할 수 있습니다.

int main(int argc, char* argv[])
{
    daemon(0,0);
    while(1)
    {
        sleep(10)
        /*do something*/
    }

    return 0;
}

언급URL : https://stackoverflow.com/questions/5384168/how-to-make-a-process-daemon

반응형