Partage de technologie

Android série C : démon Linux

2024-07-12

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

1. Concept

Le processus démon (elf) est un processus de service en arrière-plan sous Linux. Il s'agit d'un processus avec une longue durée de vie. Il est généralement indépendant du terminal de contrôle et exécute périodiquement certaines tâches ou attend que certains événements se produisent.

2. Modèle

2.1 Étapes de programmation du démon

  1. Créez un processus enfant, le processus parent se termine et tout le travail est effectué dans le processus enfant : formellement séparé du terminal de contrôle ;
  2. Créez une nouvelle fonction setsid() de session dans le processus enfant, rendant le processus enfant complètement indépendant et hors de contrôle ;
  3. Changer le répertoire actuel en répertoire racine chdir()Fonction : Pour éviter d'occuper le système de fichiers non montable, vous pouvez également le modifier vers d'autres chemins ;
  4. Réinitialiser le masque d'autorisation de fichier : La fonction umask() empêche les masques de création de fichiers hérités de refuser certaines autorisations pour augmenter la flexibilité du processus démon ;
  5. Fermez le descripteur de fichier : le fichier ouvert hérité ne sera pas utilisé, ce qui gaspille les ressources système et ne peut pas être désinstallé ;
  6. Commencez à exécuter le travail de base du processus démon ;
  7. Traitement de sortie du démon.

2.2 Modèle de code

#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

Lorsque vous exécutez ce programme, il devient un processus démon et n'est plus associé au terminal actuel. Vous ne pouvez pas le voir avec la commande ps. Vous devez exécuter la commande ps avec le paramètre x pour le voir. De plus, vous pouvez voir que la fermeture de la fenêtre du terminal ou la déconnexion n’affectera pas le fonctionnement du démon.

3. Rôle du processus démon

Pourquoi le processus démon doit-il être séparé du terminal de contrôle ?

La raison pour laquelle il est séparé du terminal est d'éviter que le processus ne soit interrompu par des informations générées par n'importe quel terminal, et ses informations pendant l'exécution ne seront affichées sur aucun terminal.Puisque sous Linux, l'interface par laquelle chaque système communique avec les utilisateurs est appelée un terminal, chaque processus qui démarre à partir de ce terminal s'appuiera sur
Rattaché à ce terminal, ce terminal est appelé terminal de contrôle de ces processus. Lorsque le terminal de contrôle est fermé, les processus correspondants se fermeront automatiquement. Cependant, beaucoup de nos applications ne souhaitent pas quitter le processus sans désactiver les interruptions, telles que les bases de données, les services Web, les services de jeux, etc. À ce stade, nous devons utiliser un processus démon.

4. Résumé

Cet article présente le concept de processus démon, les étapes de programmation du processus démon, l'implémentation du code et le rôle du processus démon. Aidez-nous à comprendre les principes de fonctionnement des programmes d'arrière-plan, etc.