2017-06-01 8 views
3

Ich lese Nginx Open Source und ich frage mich, warum würde jemand den Elternprozess töten und Kind Prozess den Rest des Programms behandeln? Warum lässt Elternprozess nicht einfach damit umgehen? Ihre Hilfe wird sehr geschätzt.Was ist der Zweck des Ersetzens des Elternprozesses und des Hinterlassens des Kindprozesses nach fork()?

Ich benutze Eclipse CDT, um das Programm zu debuggen, und dies führt dazu, dass mein Debug zu einer Sackgasse kommt, da es weiterhin den Elternprozess debuggt, nicht den Kindprozess (der tatsächlich den Rest des Programms behandelt).

Hier ist ein Ausschnitt aus dem Code:

ngx_int_t 
ngx_daemon(ngx_log_t *log) 
{ 
    int fd; 
    switch (fork()) { 
    case -1: 
     ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); 
     return NGX_ERROR; 

    case 0: 

     break; 

    default: 
    exit(0); 

    } 
/* Do stuff*/ 
} 

EDIT: verstehe ich, dass Verfahren für deamonizing ein Programm ist, aber ich bin immer noch fragen, warum wir, dass am Anfang tun sollte?

+7

Es ist eine Möglichkeit, den Daemon von der Ausführungsumgebung des übergeordneten Prozesses zu trennen. Es ist auch eine Möglichkeit, das Programm im Hintergrund weiterlaufen zu lassen, während der Benutzer weiterhin separat arbeiten kann, was in heutigen Shells mit Hintergrundjobs nicht unbedingt erforderlich ist, so dass nur der erste Grund übrig bleibt. –

+2

Wenn Sie für jede Abfrage verzweigen, wenn Sie die Konfiguration ändern möchten Sie die Gabel beenden ihren Job beenden und töten die Eltern, um eine neue mit der neuen Konfiguration –

+0

@Someprogrammerdude, vielen Dank für Ihre Antwort. Wäre es jedoch nicht schlimm zu erklären, warum wir den Daemon von der Ausführungsumgebung des Parent-Prozesses trennen sollten? Ich habe über Linux in Linux gelesen, aber ich habe es immer noch nicht klar verstanden. Vielen Dank :) –

Antwort

2

Der Hauptteil der Deamonisierung eines Programms besteht darin, es von seinem steuernden Terminal zu trennen.

Um dies zu tun, rufen Sie .

setsid() erfordert, dass der Aufrufer kein Prozessgruppenleiter ist (ein Prozess, der direkt von einer Shell mit Jobsteuerung ausgeführt wird).

Wenn Sie fork und dann in das Kind fortsetzen, wird das Kind definitiv kein Prozessgruppenleiter sein, der den Aufruf setsid() ermöglicht, erfolgreich zu sein.

Danach sollten Sie die fork + exit-Prozedur wiederholen, um sicherzustellen, dass das fortfahrende Enkelkind auch kein Sitzungsleiter ist und sicherstellt, dass es ohne kontrollierendes Terminal bleibt (ein Sitzungsleiter (festgelegt durch setsid()) kann a Terminal, vielleicht sogar versehentlich durch Öffnen einer Terminal-Datei).

+0

Also nehme ich an, dass das Ziel eines Programms ist, es im Hintergrund laufen zu lassen und auf Anfragen zu warten. Um das zu tun, anstatt eine Schleife im Code zu verwenden, deamonisieren wir es durch 'fork()' und 'exit()' den Elternprozeß auf jeder Schleife, ist das richtig? –

+2

Deamonizing ein Programm ist wirklich hauptsächlich nur über das Trennen von seinem steuernden Terminal. Was der Daemon tut (ob er nur hallo world an ein Log ausgibt und ob er in eine Serverschleife eintritt) ist für seinen Deamon-Status (kein kontrollierendes Terminal + einige andere kleine Details) irrelevant. Check out https://stackoverflow.com/questions/3095566/linux-daemonize – PSkocik

+0

Hallo @ PSkocik, verstehe ich das Verfahren der Deamonisierung eines Programms jetzt. Allerdings bin ich immer noch verwirrt über den Zweck, es am Anfang zu entamonisieren. Laut Ihrer Antwort gehe ich davon aus, dass meine erste Annahme falsch war. Warum müssen wir also "ein Programm von seinem steuernden Terminal trennen"? –

Verwandte Themen