技術共有

Android C シリーズ: Linux デーモン

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. コンセプト

デーモン (elf) プロセスは、Linux のバックグラウンド サービス プロセスであり、通常は制御端末から独立しており、特定のタスクを定期的に実行するか、特定のイベントが発生するのを待ちます。

2.モデル

2.1 デーモンプログラミングの手順

  1. 子プロセスを作成すると、親プロセスが終了し、すべての作業が子プロセスで実行されます。つまり、制御端末から正式に分離されます。
  2. 子プロセスに新しいセッションの setsid() 関数を作成し、子プロセスを完全に独立させ、制御不能にします。
  3. 現在のディレクトリをルートディレクトリに変更します chdir()機能: マウントできないファイル システムが占有されるのを防ぐために、それを他のパスに変更することもできます。
  4. ファイル許可マスクをリセットする: umask() 関数は、継承されたファイル作成マスクが特定の許可を拒否するのを防ぎ、デーモン プロセスの柔軟性を高めます。
  5. ファイル記述子を閉じます。継承された開いているファイルは使用されないため、システム リソースが無駄になり、アンインストールできません。
  6. デーモンプロセスの中核となる作業の実行を開始します。
  7. デーモンの終了処理。

2.2 コードモデル

#include <stdlib.h> 
#include <stdio.h> 
#include <fcntl.h>
void daemonize(void)
{
	pid_t pid;
	/*
	 * 成为一个新会话的首进程,失去控制终端 
	 */
	 if ((pid = fork()) < 0) { 
	 	perror("fork");
		exit(1);
		} else if (pid != 0) /* parent */
			exit(0); 
		setsid();
	/*
	 * 改变当前工作目录到/目录下. 
	 */
	if (chdir("/") < 0) { 
		perror("chdir"); 
		exit(1);
	}
	/* 设置umask为0 */ 
	umask(0);
	//重定向0,1,2文件描述符到 /dev/null,因为已经失去控制终端,再操作0,1,2没有意义.
	close(0); 
	open("/dev/null", O_RDWR); 
	dup2(0, 1);
	dup2(0, 2);
}
int main(void) {
	daemonize(); 
	while(1);
	/* 在此循环中可以实现守护进程的核心工作 */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

このプログラムを実行すると、デーモン プロセスになり、現在の端末には関連付けられなくなります。 ps コマンドでは表示できません。表示するには、x パラメーターを指定して ps コマンドを実行する必要があります。さらに、ターミナル ウィンドウを閉じたりログアウトしても、デーモンの実行には影響しないことがわかります。

3. デーモンプロセスの役割

デーモンプロセスを制御端末から分離する必要があるのはなぜですか?

端末から切り離しているのは、端末が生成する情報によって処理が中断されることを防ぐためであり、実行中の情報はどの端末にも表示されません。Linux では、各システムがユーザーと通信するインターフェイスはターミナルと呼ばれるため、このターミナルから実行を開始するすべてのプロセスは
この端末に接続されているこの端末を、これらのプロセスの制御端末と呼びます。制御端末が閉じられると、対応するプロセスが自動的に閉じられます。ただし、データベース、Web サービス、ゲーム サービスなど、アプリケーションの多くは、割り込みをオフにせずにプロセスを終了することを望んでいません。現時点では、デーモン プロセスを使用する必要があります。

4. まとめ

この記事では、デーモン プロセスの概念、デーモン プロセスのプログラミング手順、コードの実装、およびデーモン プロセスの役割を紹介します。バックグラウンドプログラムなどの動作原理を理解するのに役立ちます。