Heim  >  Artikel  >  System-Tutorial  >  Analyse des Schutzpatrons von Linux

Analyse des Schutzpatrons von Linux

PHPz
PHPznach vorne
2024-04-29 12:28:13498Durchsuche
Der Unterschied zwischen Hintergrundprozess und Daemon-Prozess
    Die größten Unterschiede sind wie folgt:
  • (a) Der Daemon-Prozess hat sich vollständig von der Terminalkonsole getrennt, aber das Hintergrundprogramm hat sich nicht vollständig vom Terminal getrennt (Ergebnisse werden weiterhin an das Terminal ausgegeben, bevor das Terminal geschlossen wird);
  • (b) Der Daemon-Prozess wird beim Schließen der Terminalkonsole nicht beeinträchtigt, aber das Hintergrundprogramm stoppt, wenn der Benutzer es beendet. Es muss im Nohup-Befehl und -Format ausgeführt werden, um die Auswirkungen zu vermeiden
  • (c) Die Sitzungsgruppe, das aktuelle Verzeichnis und die Dateideskriptoren des Daemons sind unabhängig. Die Ausführung im Hintergrund ist lediglich ein Fork des Terminals, um die Ausführung des Programms im Hintergrund zu ermöglichen. Daran hat sich nichts geändert;

Analyse des Schutzpatrons von Linux

Funktionen des Daemons
Daemon ist ein spezieller Prozess, der im Hintergrund läuft. Er ist vom Terminal getrennt und verhindert so, dass der Prozess durch von einem Terminal generierte Signale unterbrochen wird, und die während der Ausführung des Prozesses generierten Informationen werden auf keinem Terminal angezeigt. . Ein Daemon-Prozess führt regelmäßig bestimmte Aufgaben aus oder wartet auf die Verarbeitung bestimmter auftretender Ereignisse. Die meisten Server unter Linux werden mithilfe von Daemon-Prozessen implementiert.

Wichtige Punkte der Daemon-Programmierung
    1. Durch die Abschirmung einiger Signale im Zusammenhang mit dem Betrieb des Steuerterminals soll verhindert werden, dass das Steuerterminal gestört wird und beendet wird oder hängen bleibt, bevor der Daemon-Prozess normal gestartet wird. Code wie folgt anzeigen:
      /* 处理可能的终端信号 */
      signal(SIGTTOU, SIG_IGN);
      signal(SIGTTIN, SIG_IGN);
      signal(SIGTSTP, SIG_IGN);
      signal(SIGHUP , SIG_IGN);
      
    2. Im Hintergrund ausführen.
      /* 是父进程,结束父进程,子进程继续 */
      if(fork())
          exit(0);
      
    3. Gelangen Sie außer Kontrolle über die Terminal- und Prozessgruppe:
      • (1) Ein Prozess gehört zu einer Prozessgruppe und die Prozessgruppennummer (PGID) ist die Prozessnummer (PID) des Prozessleiters
      • (2) Prozesse in derselben Prozessgruppe teilen sich ein Steuerterminal. Standardmäßig ist dieses Steuerterminal das Terminal, an dem der Prozess erstellt wurde
      • (3) Das einem Prozess zugeordnete Steuerterminal und die Prozessgruppe werden normalerweise vom übergeordneten Prozess geerbt. Daher ist der untergeordnete Prozess weiterhin vom Terminal des übergeordneten Prozesses betroffen, da die vom Terminal generierten Signale an alle gesendet werden Prozesse in der Vordergrundprozessgruppe.
      Aus den oben genannten Gründen ist es notwendig, den Einfluss des Terminals auf den untergeordneten Prozess vollständig zu beseitigen. Es ist notwendig, setsid() aufzurufen, um den untergeordneten Prozess zum neuen Sitzungsleiter zu machen
      setsid();

      Nachdem der Aufruf von setsid() erfolgreich war, wird der Prozess, der diese Funktion aufruft, zum neuen Sitzungsleiter und neuen Prozessleiter und wird von der ursprünglichen Prozessgruppe getrennt. Durch die Exklusivität des Sitzungsprozesses gegenüber dem Kontrollterminal wird gleichzeitig der Prozess vom Kontrollterminal entkoppelt.

      Um zu verhindern, dass der Prozess das Steuerterminal erneut öffnet, wird ein untergeordneter Prozess erstellt und der übergeordnete Prozess beendet. Der untergeordnete Prozess ist nicht mehr der Sitzungsleiter, wodurch das Ziel erreicht wird. Code wie folgt anzeigen:

      /* 结束第一子进程,第二子进程继续 */
      if(fork())
          exit(0);
      
    4. Offene Dateideskriptoren schließen. Da ein Prozess offene Dateideskriptoren vom übergeordneten Prozess erbt, der ihn erstellt hat, werden sie im Allgemeinen nicht mehr benötigt. Wenn es nicht geschlossen wird, werden Systemressourcen verschwendet. Code wie folgt anzeigen:
      #define NOFILE  256
      
      for(i=0; i
    5. Ändern Sie das aktuelle Arbeitsverzeichnis. Während ein Prozess aktiv ist, kann das Dateisystem, das sein Arbeitsverzeichnis enthält, nicht ausgehängt werden. Daher müssen Sie das Arbeitsverzeichnis des Daemons in ein geeignetes Verzeichnis ändern. Code wie folgt anzeigen:

      chdir("/tmp");
    6. Dateierstellungsmaske zurücksetzen. Ein Prozess erbt die Dateierstellungsmaske vom übergeordneten Prozess, der ihn erstellt hat. Es kann die Zugriffsberechtigungen der vom Daemon erstellten Dateien ändern. Code wie folgt anzeigen:
      umask(0);
      
    7. Verarbeiten Sie das SIGCHLD-Signal (Signal zum Beenden des untergeordneten Prozesses). Wenn Sie nicht auf das Ende des untergeordneten Prozesses warten, wird der untergeordnete Prozess zu einem Zombie-Prozess und belegt Systemkernelressourcen.
      /* 将子进程退出信号设为SIG_IGN,让系统帮助回收进程资源 */
      signal(SIGCHLD, SIG_IGN);
    8. Der Gesamtcode lautet wie folgt:
    9. #define NOFILE      256
      
      void DaemonMode()
      {
          int num = 0;
          int fd0, fd1, fd2;
      
          /* 屏蔽可能的信号 */
          signal(SIGTTOU, SIG_IGN);
          signal(SIGTTIN, SIG_IGN);
          signal(SIGTSTP, SIG_IGN);
          signal(SIGHUP , SIG_IGN);
      
          if(fork())
              exit(0);
      
          setsid();
      
          if(fork())
              exit(0);
      
          chdir("/tmp/httpd");
      
          umask(0);
      
          for(; num

Setsid()-Funktionsfunktion hinzugefügt: Wenn der aufrufende Prozess bereits der Leiter einer Prozessgruppe ist, gibt diese Funktion einen Fehler zurück. Um diese Situation zu verhindern, wird normalerweise fork () aufgerufen, um einen untergeordneten Prozess zu erstellen. Anschließend wird der übergeordnete Prozess beendet, während der untergeordnete Prozess fortgesetzt wird und diese Funktion im untergeordneten Prozess aufgerufen wird.

Wenn der Prozess, der diese Funktion aufruft, kein Prozessgruppenleiter ist, erstellt diese Funktion eine neue Sitzung und der Prozess, der die Funktion „setsid()“ aufruft, wird zum Leiterprozess der neuen Sitzung und wird von der Sitzungsgruppe und dem Prozess getrennt Gruppe seines übergeordneten Prozesses. Da die Sitzung ausschließlich für das steuernde Terminal gilt, wird der Prozess gleichzeitig vom steuernden Terminal getrennt.

Das obige ist der detaillierte Inhalt vonAnalyse des Schutzpatrons von Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:linuxprobe.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen