2011-06-01 6 views
1
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); 
    } 

私には意味がないようですが、それはpidだけを変更するだけです。このようなデーモン化の目的は何ですか?

ベニフィットとは何ですか?

答えて

3

プロセスが端末から切り離され、プロセスを開始したユーザーがセッションを終了すると、プロセスは実行されたままになります。

Daemonizingはフォークだけでなく、制御ターミナルからプロセスを切り離す子プロセスにsetsid(2)を呼び出すことを伴います。 psを実行すると、tty列に?とマークされたプロセスが表示されます。

また、デーモンを起動すると、シェルがプロセスの終了を待たずに、フォークの直後にシェルに制御を戻します。

+0

これは私には理にかなって:これはあまりにも多くの詳細が含まれて答えてください。 – cpuer

+0

@Blagovest Buyukliev、もしあなたが 'setsid'が' fork'の後に呼び出されなければ、シェルはまだそこで待つでしょうか? – cpuer

+0

'setsid'が呼び出されなかった場合、シェルは待機しませんが、プロセスを起動したユーザーがログアウトした後にプロセスが終了します。通常、デーモンには望ましくありません。 –

1

これは、親子リンクを解除することです。子供を待っている親は、子供がデーモンをスポーンして終了するので、待機を停止します。

+0

ですが、このプロセスにはこれまでの親はありません。 – cpuer

+0

@cpuer:親はシェルまたは 'init'か、コマンドを実行してデーモンを起動します。デーモンを起動するコマンドが子になります。子はデーモンを生成して終了し、親の待ち時間を満たします。 – Gabe

関連する問題