기술나눔

Android C 시리즈: Linux 데몬

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 컨셉

데몬(elf) 프로세스는 Linux의 백그라운드 서비스 프로세스로, 일반적으로 제어 터미널과 독립적이며 특정 작업을 수행하거나 특정 이벤트가 발생할 때까지 기다립니다.

2. 모델

2.1 데몬 프로그래밍 단계

  1. 하위 프로세스를 생성하면 상위 프로세스가 종료되고 모든 작업이 하위 프로세스에서 수행됩니다. 공식적으로 제어 터미널과 분리됩니다.
  2. 하위 프로세스에 새 세션 setid() 함수를 생성하여 하위 프로세스를 완전히 독립적이고 통제할 수 없도록 만듭니다.
  3. 현재 디렉터리를 루트 디렉터리로 변경 chdir()기능: 마운트할 수 없는 파일 시스템을 점유하지 않도록 다른 경로로 변경할 수도 있습니다.
  4. 파일 권한 마스크 재설정: umask() 함수는 상속된 파일 생성 마스크 단어가 특정 권한을 거부하는 것을 방지하여 데몬 프로세스의 유연성을 높입니다.
  5. 파일 설명자를 닫습니다. 상속된 열린 파일은 사용되지 않습니다. 이는 시스템 리소스를 낭비하고 제거할 수 없습니다.
  6. 데몬의 핵심 작업 실행을 시작합니다.
  7. 데몬 종료 처리.

2.2 코드 모델

#include <stdlib.h> 
#include <stdio.h> 
#include <fcntl.h>
void daemonize(void)
{
	pid_t pid;
	/*
	 * 成为一个新会话的首进程,失去控制终端 
	 */
	 if ((pid = fork()) < 0) { 
	 	perror("fork");
		exit(1);
		} else if (pid != 0) /* parent */
			exit(0); 
		setsid();
	/*
	 * 改变当前工作目录到/目录下. 
	 */
	if (chdir("/") < 0) { 
		perror("chdir"); 
		exit(1);
	}
	/* 设置umask为0 */ 
	umask(0);
	//重定向0,1,2文件描述符到 /dev/null,因为已经失去控制终端,再操作0,1,2没有意义.
	close(0); 
	open("/dev/null", O_RDWR); 
	dup2(0, 1);
	dup2(0, 2);
}
int main(void) {
	daemonize(); 
	while(1);
	/* 在此循环中可以实现守护进程的核心工作 */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

이 프로그램을 실행하면 데몬 프로세스가 되며 더 이상 현재 터미널과 연결되지 않습니다. ps 명령으로는 볼 수 없습니다. 이를 보려면 x 매개변수와 함께 ps 명령을 실행해야 합니다. 또한 터미널 창을 닫거나 로그아웃해도 데몬 실행에는 영향을 미치지 않는 것을 확인할 수 있습니다.

3. 데몬 프로세스의 역할

데몬 프로세스를 제어 터미널과 분리해야 하는 이유는 무엇입니까?

단말기와 분리된 이유는 어떤 단말기에서 생성된 정보로 인해 프로세스가 중단되는 것을 방지하기 위함이며, 실행 중 해당 정보는 어떤 단말기에도 표시되지 않습니다.Linux에서는 각 시스템이 사용자와 통신하는 인터페이스를 터미널이라고 부르므로 이 터미널에서 실행을 시작하는 모든 프로세스는 다음 사항에 의존합니다.
이 터미널에 연결된 이 터미널을 이러한 프로세스의 제어 터미널이라고 합니다. 제어 터미널이 닫히면 해당 프로세스가 자동으로 닫힙니다. 그러나 많은 애플리케이션은 데이터베이스, 웹 서비스, 게임 서비스 등과 같은 인터럽트를 끄지 않고 프로세스를 종료하는 것을 원하지 않습니다. 이때 데몬 프로세스를 사용해야 합니다.

4. 요약

이 기사에서는 데몬 프로세스의 개념, 데몬 프로세스의 프로그래밍 단계, 코드 구현 및 데몬 프로세스의 역할을 소개합니다. 백그라운드 프로그램 등의 작동 원리를 이해하도록 도와주세요.