wie ein daemonize eine c/c++ Programm auf Linux

Ich schrieb einen daemon-Programm unter Linux nach der Anleitung auf [http://linux.die.net/man/1/daemonize][1], aber der Prozess ist abgestürzt mehrere Male, und ich kann nicht finden, den Grund. Es hat mich beunruhigt seit ein paar Tagen.

Heute habe ich zufällig gelesen haben, 'UNIX network Programming
Band 1, Dritte Auflage' von W. Richard Stevens. Und in diesem Buch, es zeigt ein Beispiel zum schreiben von daemon-Programm. Nach dem Lesen der Beispiel, ich erkannte 'Trennen von der control terminal" fehlt aus meinem code.

Nun meine Frage ist daemonize ein Prozess, warum benötigen wir distanzieren von der Steuerung der Terminals? Und hat es mit dem Absturz in Zusammenhang des Prozesses? Gibt es irgendeine andere Stelle fehlt in meinem code für daemonize?

Schätzen Sie Ihre replays.

Hier ist mein code:

bool daemonize()
{
    //http://linux.die.net/man/1/daemonize

    //change working dir to root
    (void) uchdir("/");

    //close stdin, stderr, stdout
    if (int fdnull = open("/dev/null", O_RDWR))
    {   
        dup2 (fdnull, STDIN_FILENO);
        dup2 (fdnull, STDOUT_FILENO);
        dup2 (fdnull, STDERR_FILENO);
        close(fdnull);
    }   
    else
    {   
        Log (ERR, "Failed to open /dev/null");
        return false;
    }   

    //detach from previous process group
    if (setsid () == -1)      /* request a new session (job control) */
    {   
        Log (ERR, "Failed to detach from previous process group");
        return false;
    }   

    //inhibit others completely and group write
    umask(027);

    //it's dameonized!
    return true;
}
  • Das ist nicht C. Es sieht aus wie C++. Fix your tags, bitte. (Wir trennen von der Klemme, weil, wenn das terminal geschlossen wird, sind alle Prozesse, die noch immer an das terminal angeschlossen bekommen ein SIGHUP-signal. Eine neue Prozess-Gruppe (neue Sitzung) gestartet, weil die Signale gesendet werden können, um eine gesamte Gruppe Prozess (und dieser Mechanismus ist sehr nützlich, z.B. Benachrichtigung der Multiprozess-Dämonen), und der neue Dämon ist logisch getrennt von vorherigen Prozess-Gruppe.) Auch Linux-Prozesse nicht "Abstürzen ohne Grund". Es gibt immer einen Grund: entweder exit-status, oder das signal verursacht, dass der Prozess zu sterben.
  • Stoppen Sie das hinzufügen von C-tag für nicht-C-code!
  • Ändern Sie einfach einige Anrufe nicht C++ - code C-code. Dass man sich nicht kompilieren mit einem C-compiler! Make up your mind! Verwenden Sie einen C-compiler zum kompilieren von C-code. C++ ist eine verschiedene Sprache! SO dass Sie offenbar verwenden Sie eine C++ - compiler kompilieren Sie diese.
  • Das sagte die Sprache ist meist irrelevant hier, denn die Frage ist, über disassociating aus einem terminal-und einem crash-das wird wahrscheinlich nicht betroffen sein, z.B. mit 0 statt false... Was wir wirklich brauchen, ist: 1) dass Dies zwei getrennte Fragen (Warum tun wir trennen + Warum ist dieser Absturz) und 2) Ein wenig mehr debugging-Aufwand, z.B. eine klarere Beschreibung von "crash" und einem gdb den stack-trace oder etwas zumindest, und etwas mehr Kontext, um zu lösen die letzteren.
  • Ich bin über die Sprache. (nur: false ist auch Bestandteil der C-Sprache; das ist nicht das problem).
  • Ja... habe ich vergessen, ich habe Sie nicht benutzt, C in eine sehr lange Zeit. Aber... weißt du, was ich meine. Stell dir vor, ich habe eine richtige Beispiel statt, heh.
  • Ich Stimme mit Ihnen es ist kein C-code. Aber für diese daemonize Frage spielt es eine Rolle, wenn es geschrieben von C oder C++? Alle system-calls habe ich hier geschrieben sind C und ich möchte wissen, ob etwas fehlt hier.
  • Es war nicht, mich mit falschen tags. Bei Verwendung von Bibliotheksfunktionen oder die Systemaufrufe in C geschrieben ist, würde rechtfertigen, die C-tag, alle Frage musste tagged C. Sie können kaum ohne system-Funktion, die stammt nicht aus dem C-source-code auf einer bestimmten Ebene.

InformationsquelleAutor walker | 2016-09-11
Schreibe einen Kommentar