デーモンプログラム
-
fork()
、その後親プロセス終了。 - プログラムを起動したシェルに制御が戻る。
- このfork()は新しいプロセスが プロセスグループリーダーにならないようにするため。
setsid()
はプロセスグループリーダーだと失敗する。 -
setsid()
によりプロセスグループとセッショングループのリーダーとなる。制御端末はセッションに関連づけらている。この新しいセッショ ンは制御端末を持たない。そのためこのプロセスは制御端末を持たない。 -
fork()
して、親プロセス(セッショングループリーダー)は終了。デーモンが、セッショングループリーダーでないので、以後制御端末 を持つことがない。 -
chdir("/")
。ファイルシステムを アンマウント出来ないことを避ける。 -
umask(0)
として、書き出すあらゆるファイルのパーミッションを制御。 やらなくてもいいけど。 - ファイルディスクリプタ0、1、2を
close()
。親プロセ スから引き継いだ標準入力、出力、エラー出力を解放する。これらのファ イルディスクリプタがどこかにリダイレクトされているかどうか分からな いため。制限値_SC_OPEN_MAX
を知るために多くのデーモンがsysconf()
を用いていることに注意してください。_SC_OPEN_MAX
はプロセス 当たりの最大ファイルオープン数です。次にループに入り、全ての有り得 るファイルディスクリプタをクローズ。同時に使えるファイルディスクリプタの数 には限りがあるため、オープンされているファイルディスクリプタがあり 得るとなら、それらをクローズする。 - stdin、stdout、stderr用に新しいディスクリプタをオープン。例えば、stdoutか stderrとしてそれをオープンし、stdinには`/dev/null'をオープン。または、`/dev/console'をstderrと/またはstdoutとし てオープンし、`/dev/null'をstdinとする。
デーモンがinetd
から起動されるものの場合は、 これらの手順は不要。その場合、 stdin、stdout、stderrは既にどれもネットワーク接続を対象として 設定されていますし、 fork()
やセッション操作はするべきではない (inetd
を混乱させることを防ぐ)。 chdir()
とumask()
のステップだけは必要。
WebSiteから要約。
デーモンの作り方
上記サイトに詳しい解説がありますが、デーモンは、制御端末を持たず、独立したセッションで動くバックグラウンドプロセスです。
- fork() し、親プロセス(Webサーバに起動されたプロセス)はすぐに終了します。次のsetsid() の呼び出しを成功させるために必要です。
- 子プロセスで setsid() を呼び出します。新しいセッションが作られ、そこのセッションリーダ兼プロセスグループリーダになります。
- セッションリーダは後から制御端末を得ることができるため、もう一度 fork() し、親プロセスはすぐに終了します。
- chdir("/") します。プロセスが握っているディレクトリはunmountできないので、邪魔にならないようにします。
- umask(0) するか、しないか。
- stdin, stdout, stderr を close() します。
0 件のコメント:
コメントを投稿