프로세스 데몬 생성 방법
프로그램을 데몬으로 만드는 방법을 이해하려고 합니다.그래서 내가 우연히 알게 된 몇 가지는 일반적으로 프로그램이 데몬이 되기 위해 다음 단계를 수행합니다.
- 불러
fork( )
. 부모로 콜을 합니다.
exit( )
이것에 의해, 원래의 부모(데몬의 조부모)는, 그 아이가 종료한 것, 데몬의 부모가 더 이상 동작하고 있지 않은 것, 및 데몬이 프로세스 그룹의 리더가 아닌 것을 만족할 수 있습니다.이 마지막 포인트는 다음 단계를 성공적으로 완료하기 위한 요건입니다.불러
setsid( )
이 명령어는 데몬에 새로운 프로세스 그룹과 세션을 제공합니다.이 두 프로세스 그룹은 모두 리더로서 사용됩니다.이것에 의해, 프로세스에는 관련지어져 있는 제어 단말기가 없는 것도 보증됩니다(프로세스가 새로운 세션을 작성한 지 얼마 되지 않아 세션은 할당되지 않습니다).작업 디렉토리를 루트 디렉토리로 변경합니다.
chdir( )
이는 상속된 작업 디렉토리가 파일 시스템상의 어디에나 있을 수 있기 때문입니다.데몬은 시스템 가동 시간 동안 실행되는 경향이 있기 때문에 임의의 디렉토리를 열어두고 싶지 않기 때문에 관리자가 해당 디렉토리가 포함된 파일 시스템을 마운트 해제하지 않도록 해야 합니다.모든 파일 기술자를 닫습니다.
- 파일 기술자 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
'programing' 카테고리의 다른 글
Vuex - mapGetters 등이지만 파라미터에 의한 매핑 (0) | 2022.07.11 |
---|---|
"기호를 찾을 수 없음" 또는 "기호를 확인할 수 없음" 오류는 무엇을 의미합니까? (0) | 2022.07.11 |
Vue 동적 mapGetters (0) | 2022.07.11 |
Allow AnyOrigin Cors가 작동하지 않음Axios Vuejs (0) | 2022.07.11 |
새 문자열 값을 올바르게 할당하려면 어떻게 해야 합니까? (0) | 2022.07.11 |