Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiele für die Implementierung von Daemon-Prozessen in C- und PHP-Umgebungen

Beispiele für die Implementierung von Daemon-Prozessen in C- und PHP-Umgebungen

*文
*文Original
2017-12-25 10:40:451475Durchsuche

Ein Daemon wird normalerweise als Hintergrundaufgabe betrachtet, die das Terminal nicht steuert. In diesem Artikel werden hauptsächlich die Methode und der prinzipielle Prozess der Implementierung des PHP-Daemon-Prozesses in einer C-Umgebung und einer PHP-Umgebung vorgestellt. Ich hoffe, dass es für alle hilfreich ist, den Daemon-Prozess in PHP zu verstehen.

Was ist ein Daemon?

Ein Daemon wird normalerweise als Hintergrundaufgabe betrachtet, die das Terminal nicht steuert. Es zeichnet sich durch drei Besonderheiten aus: Es läuft im Hintergrund, ist von dem Prozess, der es gestartet hat, getrennt und muss nicht das Terminal steuern. Die häufig verwendete Implementierungsmethode ist fork() -> setsid() -> Der Aufruf dieser Funktion kann dazu führen, dass der aktuelle Prozess das Terminal verlässt und zu einem Daemon-Prozess wird. Weitere Informationen finden Sie unter man daemon. Derzeit gibt es in PHP keine solche Funktion. Es gibt zwei Möglichkeiten, die Daemonisierung von PHP-Programmen zu implementieren:

1. Verwenden Sie den Systembefehl nohup

nohup php myprog.txt. Obwohl das ausgeführte Programm auch im Hintergrund ausgeführt wird, hängt es tatsächlich davon ab, ob der Benutzer das Terminal verlässt getötet werden. Sie müssen nohup verwenden, um

2 zu erreichen. Supervisor-Tool verwenden (empfohlene Lösung)

Detaillierte Anleitung zur Verwendung von Supervisor

3. Natürlich kann es auch per Programm implementiert werden (nicht für den Einsatz in Produktionsumgebungen empfohlen). C-Programmimplementierung:


#include#include#include#include#include#include//实现守护进程步骤
void crete_daemon(void)
{
pid_t pid = 0;
pid = fork();
if (pid<0)
{
perror("fork");
exit(-1);
}
if (pid > 0)
{
//1.父进程直接退出
exit(0);
}
//2.
//执行到这里就是子进程
//setsid 将当前进程设置为一个新的会话期session,目的就是
//让当前进程脱离控制台,成为守护进程。
pid = setsid();
if (pid < 0)
{
perror("setsid");
exit(-1);
}
//3.设置当前进程的工作目录为根目录,不依赖于其他
chdir("/");
//4.umask设置为0确保将来进程有最大的文件操作权限
umask(0);
//5.关闭文件描述符
//先要获取当前系统中所允许打开的最大文件描述符数目
int i = 0;
int cnt = sysconf(_SC_OPEN_MAX);
for (i=0;i


Testergebnisse:

Daemon-Prozess:


Die beiden kritischeren PHP Die Funktionen hier sind pcntl_fork( ) und posix_setsid()

fork() ein Prozess, was bedeutet, dass eine Kopie des laufenden Prozesses erstellt wird. Die Kopie wird als untergeordneter Prozess betrachtet und der ursprüngliche Prozess wird als übergeordneter Prozess betrachtet Verfahren. Nachdem fork() ausgeführt wurde, kann es vom Prozess und der Terminalsteuerung, die es gestartet hat, getrennt werden, was auch bedeutet, dass der übergeordnete Prozess frei beendet werden kann. setztid() macht den neuen Prozess zunächst zum „Anführer“ einer neuen Sitzung und sorgt schließlich dafür, dass der Prozess das Terminal nicht mehr kontrolliert. Dies ist auch der kritischste Schritt auf dem Weg zu einem Daemon-Prozess, was bedeutet, dass dies nicht der Fall ist wird erzwungen, wenn das Terminal geschlossen wird. Dies ist ein kritischer Schritt für einen residenten Prozess, der nicht unterbrochen werden kann. Führen Sie den letzten fork() aus. Dieser Schritt ist nicht erforderlich, wird jedoch normalerweise ausgeführt. Seine größte Bedeutung besteht darin, zu verhindern, dass das Steuerterminal abgerufen wird. (Wenn ein Endgerät direkt geöffnet wird und das O_NOCTTY-Flag nicht verwendet wird, wird das Steuerterminal abgerufen)

Andere Dinge:

Der Daemon-Prozess chdir() erbt den aktuellen Status des übergeordneten Geräts Standardmäßig arbeitet der Prozess im Arbeitsverzeichnis. Wenn die Systemfestplatte nicht gemountet ist, wird normalerweise „/“ als aktuelles Arbeitsverzeichnis des Daemon-Prozesses verwendet, wodurch die oben genannten Probleme vermieden werden können erbt standardmäßig die Dateiberechtigungsmaske des übergeordneten Prozesses Dies führt zu großen Problemen bei der Verwendung von Dateien durch den Unterprozess. Daher kann das Festlegen der Dateiberechtigungsmaske auf 0 die Flexibilität des Daemons erheblich verbessern. fclose(STDIN), fclose(STDOUT), fclose(STDERR) schließt den Standard-E/A-Stream. Der mit der Fork-Funktion erstellte untergeordnete Prozess erbt einige geöffnete Dateien vom übergeordneten Prozess. Diese geöffneten Dateien können vom Daemon möglicherweise nie gelesen oder geschrieben werden, verbrauchen jedoch dennoch Systemressourcen und können dazu führen, dass das Dateisystem, in dem sie sich befinden, nicht mehr bereitgestellt werden kann.

Verwandte Empfehlungen:

In PHP geschriebener Prozessdämon, Prozessverwaltung, automatische Startfunktion für Prozessfehler, geeignet für Serveradministratoren_PHP-Tutorial

php-cgi-Prozess-Daemon unter Windows

PHP verwendet den Prozess als Daemon-Methode, PHP Prozess-Daemon

Das obige ist der detaillierte Inhalt vonBeispiele für die Implementierung von Daemon-Prozessen in C- und PHP-Umgebungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn