Technologieaustausch

Android C-Serie: Linux-Daemon

2024-07-12

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

1. Konzept

Der Daemon-Prozess (Elf) ist ein Hintergrunddienstprozess in Linux. Er ist normalerweise unabhängig vom Steuerterminal und führt regelmäßig bestimmte Aufgaben aus oder wartet auf das Eintreten bestimmter Ereignisse.

2. Modell

2.1 Daemon-Programmierschritte

  1. Erstellen Sie einen untergeordneten Prozess, der übergeordnete Prozess wird beendet und die gesamte Arbeit wird im untergeordneten Prozess ausgeführt: formal vom steuernden Terminal getrennt;
  2. Erstellen Sie im untergeordneten Prozess eine neue Sitzungsfunktion „setsid()“, wodurch der untergeordnete Prozess völlig unabhängig und außer Kontrolle gerät.
  3. Ändern Sie das aktuelle Verzeichnis in das Stammverzeichnis chdir()Funktion: Um zu verhindern, dass das nicht mountbare Dateisystem belegt wird, können Sie es auch auf andere Pfade ändern;
  4. Dateiberechtigungsmaske zurücksetzen: Die Funktion umask() verhindert, dass geerbte Dateierstellungsmaskenwörter bestimmte Berechtigungen verweigern, um die Flexibilität des Daemon-Prozesses zu erhöhen;
  5. Schließen Sie den Dateideskriptor: Die geerbte geöffnete Datei wird nicht verwendet, was Systemressourcen verschwendet und nicht deinstalliert werden kann.
  6. Beginnen Sie mit der Ausführung der Kernarbeit des Daemons.
  7. Daemon-Exit-Verarbeitung.

2.2 Codemodell

#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

Wenn Sie dieses Programm ausführen, wird es zu einem Daemon-Prozess und ist nicht mehr mit dem aktuellen Terminal verknüpft. Sie können es nicht mit dem Befehl ps sehen. Sie müssen den Befehl ps mit dem Parameter x ausführen, um es anzuzeigen. Darüber hinaus können Sie sehen, dass das Schließen des Terminalfensters oder das Abmelden keinen Einfluss auf die Ausführung des Daemons hat.

3. Rolle des Daemon-Prozesses

Warum muss der Daemon-Prozess vom steuernden Terminal getrennt werden?

Der Grund für die Trennung vom Terminal besteht darin, zu verhindern, dass der Prozess durch von einem Terminal generierte Informationen unterbrochen wird und seine Informationen während der Ausführung auf keinem Terminal angezeigt werden.Da unter Linux die Schnittstelle, über die jedes System mit Benutzern kommuniziert, als Terminal bezeichnet wird, ist jeder Prozess, der von diesem Terminal aus gestartet wird, darauf angewiesen
Dieses an dieses Terminal angeschlossene Terminal wird als Steuerterminal dieser Prozesse bezeichnet. Wenn das Steuerterminal geschlossen wird, werden die entsprechenden Prozesse automatisch geschlossen. Viele unserer Anwendungen möchten den Prozess jedoch nicht beenden, ohne Interrupts auszuschalten, z. B. Datenbanken, Webdienste, Spieledienste usw. Zu diesem Zeitpunkt müssen wir Daemon-Prozesse verwenden.

4. Zusammenfassung

In diesem Artikel werden das Konzept des Daemon-Prozesses, die Programmierschritte des Daemon-Prozesses, die Code-Implementierung und die Rolle des Daemon-Prozesses vorgestellt. Helfen Sie uns, die Funktionsweise von Hintergrundprogrammen usw. zu verstehen.