Starten eines Prozesses im hintergrund in Linux mit C
Ich versuche, etwas zu tun, ein wenig seltsam hier. Ich brauche, um einen Prozess zu starten, logcat, von einem Dämon, der im hintergrund ausführen und drucken auf dem terminal ohne die Kontrolle von stdin. Es ist für die Protokollierung, so dass im Idealfall logcat druckt log-Meldungen, während immer noch so dass der Nutzer zur Eingabe standard-Befehle und parametrieren-Programme von der shell aus. Hier ist der code für den daemon habe ich so weit. Das Programm, logcat, startet und zeigt log-Nachrichten, aber ich kann nicht geben Sie alle Befehle, die in stdin, wie es scheint, dass das Programm die Kontrolle über stdin.
int main ( int argc, char** argv, char** env )
{
int fd;
if ((fd = open("/dev/console", O_RDWR)) < 0) {
fd = open("/dev/null", O_RDWR);
}
printf("THIS IS A TEST\n");
dup2(1, fd);
dup2(2, fd);
pid_t childpid = fork();
if(childpid == -1) {
perror("Failed to fork, logcat not starting");
return 1;
}
if(childpid == 0) {
//this is the child, exec logcat
setsid();
int execReturn = execl("/system/bin/logcat", "logcat", (char *) 0);
} else {
//this is the parent do nothing
close(fd);
return 0;
}
close(fd);
return 0;
}
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den 'logcat' Befehl scheint für die Android-Entwicklung - das könnte erklären, die ungerade Position des Befehls.
Die Taste operation, die Sie beheben muss, ist, um sicherzustellen, dass Sie in der Nähe Ihrer aktuellen standard-Eingabe (terminal) und öffnen
/dev/null/
für die input-Gerät:Dies bedeutet, dass Ihre daemonisierte Kind-Prozess wird nicht alles Lesen aus dem terminal.
Was ich denke, Sie wollen zu tun ist:
/dev/null
.logcat
zu schreiben, um die aktuelle standard-Ausgabe.Irgendwann in den Verfahren, die Sie tun Sie Ihre daemonization richtig (in Anlehnung an den link von @bstpierre Antwort), um sicherzustellen, dass das terminal, mit dem Sie verbunden sind, ist nicht Ihr controlling terminal, so dass interrupts und Hänger an das terminal keinen Einfluss auf Ihre daemon. Der Sanitär ist einfacher als das, was Sie haben - Sie sollte sich mit standard-Eingabe und verlassen der standard-Ausgabe und standard-Fehler unverändert (anstelle der änderung der Ausgänge und verlassen die Eingabe unverändert).
Nun, möchten Sie vielleicht den Ausgang zu gehen, um
/dev/console
; wenn dem so ist, dann ist es vernünftig zu überarbeiten und den code zum öffnen/dev/console
. Es ist jedoch nicht zumutbar, auf den zurückgegriffen/dev/null
wenn Sie Sie nicht öffnen können/dev/console
; Ihr Programm soll einen Fehler melden und nicht (weil es keinen Punkt gibt, in logcat schreiben/dev/null
!). Stellen Sie sicher, dass Sie die Konsole öffnen, mit derO_NOCTTY
flag, damit diese nicht die controlling-terminal für den daemon.Den letzten Kommentar, den ich machen würde ist:
Ich nicht viel mag es, wenn das passiert.
Siehe auch: SO 958249
How to Daemonize in Linux [Toten link]
How to Daemonize in Linux [wayback machine Archiv von den oben]
gist auf github - code entnommen, der link oben
Zusammenfassung:
Gibt es spezielle purposed Funktion in der glibc:
Mehr details hier http://linux.die.net/man/3/daemon