Compartilhamento de tecnologia

Série Android C: Daemon Linux

2024-07-12

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

1. Conceito

O processo daemon (elfo) é um processo de serviço em segundo plano no Linux. É um processo com longa vida útil. Geralmente é independente do terminal de controle e executa determinadas tarefas periodicamente ou aguarda a ocorrência de determinados eventos.

2. Modelo

2.1 Etapas de programação do daemon

  1. Crie um processo filho, o processo pai é encerrado e todo o trabalho é executado no processo filho: formalmente separado do terminal de controle;
  2. Crie uma nova função setsid() de sessão no processo filho, tornando o processo filho completamente independente e fora de controle;
  3. Mude o diretório atual para o diretório raiz chdir()Função: Para evitar a ocupação do sistema de arquivos não montável, você também pode alterá-lo para outros caminhos;
  4. Redefinir máscara de permissão de arquivo: A função umask() evita que palavras de máscara de criação de arquivo herdadas neguem certas permissões para aumentar a flexibilidade do processo daemon;
  5. Feche o descritor de arquivo: o arquivo aberto herdado não será utilizado, o que desperdiça recursos do sistema e não pode ser desinstalado;
  6. Comece a executar o trabalho principal do daemon;
  7. Processamento de saída do daemon.

2.2 Modelo de código

#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

Quando você executa este programa, ele se torna um processo daemon e não está mais associado ao terminal atual. Você não pode vê-lo com o comando ps. Você deve executar o comando ps com o parâmetro x para vê-lo. Além disso, você também pode ver que fechar a janela do terminal ou sair não afetará a execução do daemon.

3. Papel do processo daemon

Por que o processo daemon precisa ser separado do terminal de controle?

A razão pela qual está separado do terminal é para evitar que o processo seja interrompido por informações geradas por qualquer terminal, e suas informações durante a execução não serão exibidas em nenhum terminal.Como no Linux a interface através da qual cada sistema se comunica com os usuários é chamada de terminal, todo processo que começa a ser executado a partir deste terminal dependerá de
Anexado a este terminal, este terminal é chamado de terminal de controle desses processos. Quando o terminal de controle é fechado, os processos correspondentes serão fechados automaticamente. Porém, muitas de nossas aplicações não desejam sair do processo sem desligar as interrupções, como bancos de dados, serviços web, serviços de jogos, etc. Neste momento, precisamos usar processos daemon.

4. Resumo

Este artigo apresenta o conceito de processo daemon, as etapas de programação do processo daemon, implementação de código e a função do processo daemon. Ajude-nos a compreender os princípios operacionais de programas em segundo plano, etc.