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
stattfalse
... 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind die grundlegenden Schritte zur deamonize eine C-oder C++ - Programm wurde bereits in dieser Frage: Erstellen einen daemon in Linux
Ja, die Frage gab es für C und nicht für C++, aber da das system fordert Sie müssen daemonize ein Programm sind C-Funktionen in beiden Fällen, das ist wirklich nicht einen Unterschied machen.
Fand ich das github-repository nützlich, es hat alles was Sie brauchen, um zu bauen ein daemon:
Einfaches Beispiel daemon für Linux
Und hier ist ein stack-overflow-thread, warum Doppel Gabel ist nötig.
Nicht auf Ihre eigentliche Frage aber...
bitte nicht!
Programme, die
daemon
-ize, sind der Fluch jeder vernünftige init-system-und service-tracker. Das problem ist, dass nach einem Programm löst sich von seinen kontrollierenden terminal und der übergeordnete Prozess wird es schwer den überblick zu behalten über seinen Zustand und die Kontrolle über es. Der übliche Weg der Verwendung von PID-Dateien ist anfällig für race conditions, die besonders schlimm ist, wenn die Absicht ist, um automatisch respawnen solchen Prozesses.Den Einsatz von
daemon
führte zu der Entwicklung von mehreren hacks, einige völlig hässlich eine Art okay, aber keiner von Ihnen, schön. Tun Sie sich selbst und dem rest der Welt einen gefallen und nicht daemonize Ihr Programm.