4

C のデーモンに関する一般的な質問がありますが、今のところ回答がありません。

規約や標準のように、デーモンプロセスの制御を実装する方法はありますか?

--残りは補足説明です--

Cでデーモンを作成する方法の基本を教える複数のドキュメントを見てきました。フォーク、ファイル記述子のクローズ、ルートの変更など...問題ありません。そして、プロセスが無限ループに入ると(つまり、デーモンプロセスが作成されると)、それらはすべて停止します。しかし、デーモンのコーディングに関しては、これは道のりの半分にすぎません。どうにかしてそれを制御しなければなりません。さまざまな方法で機能させることができますが、それ以上のものがあると感じています。

このために(すでに実行中のプロセスがあるかどうかを確認するか、実行中のデーモンプロセスを停止するか、または...)、さまざまなアプローチ(UN​​IXソケット、ファイルロック、pidファイルなど)を長所と短所で見てきました。しかし、それは意見や個人的な好みのように思えました。「どうして…?」または「私はこのようにやった、それは私のために働いた」. そして、これが自由のしるしなのかどうかはわかりません。

つまり、sshd、httpd、syslogd などを見ると、それらはすべて init-scripts またはサービス コマンド (start|stop|status) を介して制御できます。これが標準のようです。しかし、これは多くの人が従おうとする緩い慣習にすぎないのでしょうか?それとも、C 関数の深海にある種の「フレームワーク」があるのでしょうか? 何らかの方法で動作させる必要がありますか?たとえば、プログラムを「停止」引数に応答させ、デーモンプロセスを何らかの方法で終了させますか? それとも、「適切でクリーンなコード」を書くために従うべきであり、ほとんどの環境にうまく統合される、ある種の標準、慣例、UNIX 方式のベスト プラクティスはありますか?

私の主な質問は次のとおりです。それを行う方法はありますか?

もしそうなら、どこでより多くの情報を見つけることができますか? 起動と停止だけでなく、もっと注意すべきことがあると思います。

4

2 に答える 2

3

標準はありませんが、既にお気づきのように事実上の標準はあります。

これらの例の 1 つ (Apache など) を取り上げて、apachectl の機能を調べることをお勧めします。ファイルから読み取った PID の認識に基づいて、デーモンにシグナルを送信することがわかります。

Apache の場合、ある種の HTTP 要求でサーバーを停止できるようにしたくないため、シグナルは理にかなっています。DBMS の場合、最初に認証と承認を行った場合、受信コマンドに応答してサーバーを停止することをお勧めします。

于 2013-02-22T13:48:13.550 に答える
2

シグナルを使用するか、デーモンが UNIX ソケットを (適切なパーミッションで) 作成し、データをリッスンすることができます。これは、プログラムに対して実装する必要がある制御の量によって異なります。

トラフィックの少ないものについては、xinetd を使用してフォークして接続を処理し、要求に応答するだけで便利な場合があることを覚えておいてください。

于 2013-02-22T14:08:59.313 に答える