Prozesse unter Linux dämonisieren

Prozess- und Peripheriekonzepte

TTY (virtuelles Terminal) -Session | -Prozessgruppe | -Prozess

"TTY = Sitzung 1> N Prozessgruppe 1> N Prozess"

Einer der Prozesse ist ein Sitzungsleiter, und mehrere von ihnen sind Prozessgruppenleiter.

Session

Eine mit TTY verknüpfte Anmeldesitzung. Es ist eine Gruppe von einer oder mehreren Prozessgruppen, und der Prozess, der zum Sitzungsleiter wird, hat die Aufgabe, mit dem Steuerterminal zu interagieren und alle untergeordneten Prozesse zu beenden, wenn das Terminal getrennt wird. Prozessgruppen können nur innerhalb der Sitzung erstellt werden, zu der sie gehören.

Prozessgruppe

Eine Sammlung von Prozessen, die Signale an andere Prozesse senden können. Mitglieder haben die Prozess-ID des Prozessgruppenleiters als Gruppen-ID. Rufen Sie setpgid () oder setsid () auf, um Leiter einer Prozessgruppe zu werden.

fork() Durch Aufrufen dieser Funktion wird der Vorgang dupliziert. Wenn der Rückgabewert 0 ist, wird er vom untergeordneten Prozess verarbeitet, und wenn der Rückgabewert 0 oder mehr ist, wird er vom übergeordneten Prozess verarbeitet. Die beiden fahren gleichzeitig mit demselben Quellcode fort. Daher ist es erforderlich, mit einer if-Anweisung zu verzweigen und zwei Quellcodes für den übergeordneten Prozess und den untergeordneten Prozess zu schreiben.

Implementierung

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <sysexits.h>
#include <unistd.h>
#include <syslog.h>

#define MAXFD 64

int demonize(int chdir_flg){

    int i = 0;
    int fd = 0;
    pid_t pid = 0;


    //------------------------------------------------------
    //Status.
    //Übergeordneter Prozess beim Programmstart(shell)Habe und habe einen TTY.
    //------------------------------------------------------
    
    
    //------------------------------------------------------
    //Erstellen Sie einen untergeordneten Prozess, um den übergeordneten Prozess zu trennen und die Steuerung an die Shell zurückzugeben.
    //------------------------------------------------------
    if((pid = fork()) == -1){

        return -1;

    //Der übergeordnete Prozess wird nach dem Erstellen des untergeordneten Prozesses beendet.
    }else if(pid != 0){

        //Rufen Sie keine benutzerdefinierten Bereinigungsfunktionen auf_exit()ich mache.
        _exit(0);
    }
    
    
    //------------------------------------------------------
    //Status.
    //Nur untergeordnete Prozesse, aber TTY bleibt erhalten.
    //------------------------------------------------------
    

    //------------------------------------------------------
    //Trennen Sie TTY, um Sitzungsleiter und Prozessgruppenleiter zu werden.
    //------------------------------------------------------
    setsid();
    

    //------------------------------------------------------
    //HUP-Signal ignorieren.
    //Weil HUP-Signale an das Kind gesendet werden können, wenn das Elternteil stirbt.
    //------------------------------------------------------
    signal(SIGHUP, SIG_IGN);
    

    //------------------------------------------------------
    //Status.
    //Da es sich bei dieser Rate um einen Sitzungsleiter handelt, wird diese TTY zugeordnet, wenn Sie eine TTY öffnen..
    //------------------------------------------------------
    
    
    //------------------------------------------------------
    //Übergeordneter Prozess(Sitzungsgruppenleiter)Trennen.
    //Werden Sie ein elternloser, TTYloser und Nicht-Sitzungsleiter.
    //------------------------------------------------------
    if((pid = fork()) == 0){
        //Untergeordneten Prozess beenden.
        _exit(0);
    }
    


    //------------------------------------------------------
    //Bereite dich darauf vor, als Dämon zu rennen.
    //------------------------------------------------------

    //Ändern Sie das aktuelle Verzeichnis.
    if(chdir_flg == 0){
        
        //In das Stammverzeichnis wechseln.
        chdir("/");
    }
    

        
    //Schließen Sie alle vom übergeordneten Element geerbten Dateideskriptoren.
    for(i = 0; i < MAXFD; i++){
        close(i);
    }
        
    // stdin,stdout,dev stderr/Mit null öffnen.
    //Wenn Sie nur den Deskriptor schließen, führen diese Ausgaben zu einem Fehler, also dev/Auf null umleiten.
    if((fd = open("/dev/null", O_RDWR, 0) != -1)){
        
        //Doppelter Dateideskriptor.
        //0 dieses Prozesses,1,Dev zeigte auf 2 von fd/Zeigen Sie auf null.
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        if(fd < 2){
            close(fd);
        }
    }
    
    return (0);

}

int main(int argc, const char * argv[]) {

    char buf[256];
    demonize(1);
    
    //Aktuelles Verzeichnis anzeigen.
    syslog(LOG_USER | LOG_NOTICE, "demon:cwd=%s¥n", getcwd(buf, sizeof(buf)));
    
    return 0;
}

Es kann einfach durch Aufrufen von demonstr () mit der Funktion main () in einen Dämon umgewandelt werden. Wenn Sie einen Befehl zum Starten eines daemonisierten Programms in "/etc/rc.local" schreiben, können Sie ihn beim Start des Servers im Hintergrund starten.

Referenz

["Linux Network Programming Bible"](http://www.amazon.co.jp/Linux Network Programming Bible-Mitsuyuki Omata-ebook / dp / B00O8GIL62 / ref = sr_1_1? Ie = UTF8 & qid = 1429337305 & sr = 8-1 & keywords = Linux + Netzwerkprogrammierbibel) Scyphus Draft - Wie man einen Dämon macht

Recommended Posts

Prozesse unter Linux dämonisieren
jblas unter Arch Linux
Linux (WSL) unter Windows
NAT-Router unter Linux
Entwickeln Sie .NET unter Linux
Wake on Lan unter Linux
Überwachen Sie den Datenverkehr unter Linux
Aktualisieren Sie vscode unter Linux
Erstellen Sie LiveUSB unter Linux
Linux-Betrieb unter Win10
NTP-Konfigurationsnotiz unter Linux
Installieren Sie Linux auf Chromebox
Downgrade von Mcomix mit Arch Linux
Informationen zu LINUX-Dateien und -Prozessen
Überwachen Sie die Festplattennutzung unter Linux
Verwenden Sie Github Desktop unter Linux
Installieren Sie JDK unter Linux
Elixier = vertraut mit Linux Mint
Aufnahme und Wiedergabe unter Linux
TTL-Prüfung mit Linux-Router
Lesen Sie die Kernspannung unter Linux
Setzen Sie jenv in Amazon Linux ein
Einfacher Befehl df unter Linux
Linux unter Windows -1-: Einführung in Debian
Installieren Sie tomcat 5.5 unter Amazon Linux.
Einführung in Elixir in Linux Mint
Installieren von Homebrew unter Amazon Linux 2
Fügen Sie den Link unter Linux ein
Aufbau einer Linux-Umgebung (in einer WSL-Umgebung)
Verwenden Sie Linux unter Windows 10 (WSL2)
Einrichten von OpenSSH unter Arch Linux
Verwenden Sie host.docker.internal unter Linux (Docker-Compose erforderlich)
Installieren Sie Python Pillow unter Amazon Linux
Einfaches Kopieren in die Zwischenablage unter Linux
Installieren Sie Oracle Java8 unter Amazon Linux2
Versuchen Sie, OpenAM unter Amazon Linux zu installieren
Installieren Sie Arch Linux auf DeskMini A300
Abschluss des Docker-Befehls unter Linux
Führen Sie einen Linux-Server mit GCP aus
So installieren Sie VMware-Tools unter Linux
Anzeigen der Festplattennutzung unter Linux
Rippen Sie Musik-CDs unter Arch Linux
Erstellen Sie eine Linux-Umgebung unter Windows 10
Linux
[Linux] Aufbau einer Docker-Umgebung auf Redhat
[Hinweis] Installieren Sie Imagick unter Amzon Linux2
[Hinweis] Führen Sie Django unter Amazon Linux 2 aus
Führen Sie die Python 3.5.2-Umgebung unter Amazon Linux ein