バックグラウンドプロセスとデーモンプロセスの違い
最大の違いは次のとおりです:
- (a) デーモン プロセスは端末コンソールから完全に分離されていますが、バックグラウンド プログラムは端末から完全に分離されていません (端末が閉じる前でも結果は端末に出力されます);
- (b) ターミナル コンソールを閉じるときにデーモン プロセスは影響を受けませんが、影響を避けるために、バックグラウンド プログラムは nohup コマンドと形式で実行する必要があります。
(c) デーモンプロセスのセッショングループ、カレントディレクトリ、ファイル記述子は独立しています。バックグラウンドでの実行は、プログラムをバックグラウンドで実行できるようにするためのターミナルの単なるフォークです。これは何も変更されていません。-
デーモンの特徴
デーモンは、バックグラウンドで実行される特別なプロセスであり、ターミナルから分離されているため、プロセスの実行中に生成される情報はどのターミナルにも表示されません。 。デーモン プロセスは、定期的に特定のタスクを実行するか、発生する特定のイベントの処理を待機します。ほとんどの Linux サーバーは、デーモン プロセスを使用して実装されています。
デーモンプログラミングの重要なポイント
-
制御端末の動作に関連する一部の信号をシールドすることは、デーモンプロセスが正常に開始される前に制御端末が終了したりハングしたりすることによる干渉を防ぐためです。コードは以下のように表示されます:
リーリー
-
バックグラウンドで実行します。
リーリー
-
ターミナルとプロセスグループを制御不能にする:
-
(1) プロセスはプロセスグループに属しており、プロセスグループ番号(PGID)はプロセスリーダーのプロセス番号(PID)となります-
(2) 同じプロセスグループ内のプロセスは制御端末を共有します。デフォルトでは、この制御端末はプロセスが作成された端末です。
- (3) プロセスに関連付けられた制御端末とプロセスグループは、通常、親プロセスから継承されます。したがって、子プロセスは、端末によって生成されたシグナルがすべてに送信されるため、依然として親プロセスの端末の影響を受けます。フォアグラウンドプロセスグループ内のプロセス。
-
上記の理由から、子プロセスのターミナルの影響を完全に取り除く必要があります。子プロセスを新しいセッションリーダーにするには、setsid()を呼び出す必要があります。
コードは次のとおりです。
リーリー
setsid() 呼び出しが成功すると、この関数を呼び出したプロセスが新しいセッション リーダーおよび新しいプロセス リーダーになり、元のプロセス グループから分離されます。セッションプロセスは制御端末への排他性があるため、同時にプロセスは制御端末から切り離されます。
プロセスが制御端末を再度開くことを禁止するには、子プロセスを再度作成し、親プロセスをセッションリーダーでなくすることで目的を達成する方法が採用されます。コードは以下のように表示されます。
リーリー
- 開いているファイル記述子を閉じます。プロセスは、それを作成した親プロセスからオープン ファイル記述子を継承するため、通常は必要なくなります。閉じていない場合、システム リソースが無駄に消費されます。コードは以下のように表示されます:
リーリー
-
現在の作業ディレクトリを変更します。プロセスがアクティブな間は、その作業ディレクトリを含むファイル システムをアンマウントできません。したがって、デーモンの作業ディレクトリを適切なディレクトリに変更する必要があります。コードは以下のように表示されます:
リーリー
- ファイル作成マスクをリセットします。プロセスは、それを作成した親プロセスからファイル作成マスクを継承します。デーモンによって作成されたファイルのアクセス許可が変更される可能性があります。コードは以下のように表示されます。
リーリー
- SIGCHLD シグナル (子プロセス終了シグナル) を処理します。子プロセスの終了を待たないと、子プロセスはゾンビプロセスとなり、システムカーネルリソースを占有します。
リーリー
全体のコードは次のとおりです: -
リーリー
setsid() 関数関数を追加しました:
呼び出しプロセスがすでにプロセス グループのリーダーである場合、この関数はエラーを返します。この状況を防ぐために、通常は fork() を呼び出して子プロセスを作成し、その後その親プロセスを終了し、子プロセスを続行し、この関数を子プロセスで呼び出します。
この関数を呼び出すプロセスがプロセス グループ リーダーではない場合、この関数は新しいセッションを作成し、setsid() 関数を呼び出すプロセスは新しいセッションのリーダー プロセスとなり、セッション グループおよびプロセスから分離されます。親プロセスのグループ。セッションは制御端末専用であるため、プロセスは同時に制御端末から切り離されます。
以上がLinux の守護聖人の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。