1.概要
デーモンが実行され、バックグラウンドで任意のプロセス制御端子の対象ではありません。さまざまな管理タスクを実行するためにバックグラウンドで実行され、多くの一般的なUnixオペレーティングシステムデーモンは、(自分の番号が必要か20-50によって異なります)、があります。
デーモンの場合には、端末の他のユーザーと一緒に使用することができる端末から開始されるので、デーモンユーザ端末は、すべてとは無関係です。例えば、ユーザー出口は、端末からのデーモンを起動した後、その後、別の人は、端末にログオンします。後者は、すべてのエラーメッセージがデーモンを受け、端末の使用中に、ユーザーを望んでいません。同様に、端末の種類によって任意の信号は、(例えば、割り込み信号など)の端末で以前に開始されたデーモンの動作に影響を与えるべきではありません。それは(長いと&することができ、シェルのコマンドラインの終了などのように)、サーバーがバックグラウンドで実行できるように、しかし、あなたはまた、いくつかの作業を行う必要があります簡単ですが、自動的にバックグラウンドにプログラム自体を聞かせて、あらゆる端末に依存しません。
デーモンには、制御端子を持っていないので、特定の状況が発生した場合、それは管理者が処理する一般的なレポート情報や緊急情報があるかどうか、あなたには、いくつかの方法で出力したいです。syslogの出力機能はsyslogdデーモンに情報を送信し、そのような情報の標準的な方法です。
編集作成するには
(1)は、親プロセスを終了するために子プロセスを作成する
デーモンが制御端子から外れているので、その最初の誤った印象は、端末のシェル内部で実行して完了したプログラムを作り、親プロセスを終了するために子プロセスを作成し、。すべての後の仕事は、子供で行われ、ユーザーは正式に、制御端子のうちに行わゾンビプロセスの形で実行するプログラムを、作るためにシェル端末に他のコマンドを実行することができます。
(2)は、子プロセスで新しいセッションを作成
このステップのデーモンを作成することですここで最も重要なステップは、システムの機能がsetsidを使用することです。
がsetsid関数は、新しいセッションを作成するために使用され、グループの会話のヘッドを務めています。3つの役割は、鼎のがsetsid呼び出します。プロセスは、元のプロセスのコントロール群を取り除くせ、プロセスは、主制御端末の制御を取り除くせ、プロセスは元の制御セッションを取り除くみましょう。
プロセスグループは出口に親プロセスが、制御端子、(セッションが、1つ以上のプロセスグループの集合である)、親プロセスの全体的なサブプロセスのセッションのコピーをフォーク関数を呼び出すが、以前のセッションの期間、プロセスグループとき制御端子は、2つの独立したオープンの真の意味ではないこと、従って変更、およびいません。がsetsid機能はとてもコントロールの外に、他のすべてのプロセスを完全に独立したプロセスを作ることができます。
(3)作業ディレクトリを変更
子プロセスは、親プロセスの現在の作業ディレクトリを継承し作成するためにフォークを使用します。プロセスの実行中ため、そのような「/」または「/ TMP」などのようなファイルシステムは、したがって、アンインストールすることができない現在のディレクトリ、他のパスに現在の作業ディレクトリ、。作業ディレクトリを変更することは一般的な機能のCHDIRです。
(4)ファイル作成マスクリセット
ファイル作成マスク手段場合、対応するビットファイル作成マスク。新しい子プロセスの使用によるフォーク機能は、ファイルを使用して、子プロセスに多くの問題をもたらしたファイル作成マスクの親プロセスを継承します。そのため、ファイル作成マスクが0に設定されている、それは非常にデーモンの柔軟性を高めることができます。この関数はumaskを、通常の方法は、(0)umaskを使用することをファイル作成マスクを設定します。
(5)ファイルディスクリプタやリダイレクトを閉じ
フォークで新しい子プロセスが親プロセスからファイルを開いているのいくつかを継承します。これらのファイルは、デーモンは、読み取りや書き込みもないかもしれないが、彼らは、システムリソースの消費量としてあり、それはファイルシステムがアンインストールできない場所につながることができ開かれています。
以下に分かれてサービスの種類に応じて
その上でのsyslogd、ログイン、crond、:システムデーモン。
ネットワークデーモン:sendmailを、HTTPD、xinetdを、というように。
スタートアップ・デーモン:HTTPD、命名、xinetdをというように。
その上のtelnet、指、ktalkと:パッシブ(xinetdで開始)デーモン。
デーモンは、上記の5つのステップに従って実現しました
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 #include<sys/stat.h>
6 #include<fcntl.h>
7 void myDaemond()
8 {
9 pid_t pid = fork();
10 if(pid > 0) //(1)创建子进程 ,终止父进程
11 {
12 exit(1);
13 }
14
15 pid_t pid1 = setsid(); //(2) 创建新会话
16 if(pid == -1)
17 {
18 perror("setsid errror");
19 exit(1);
20 }
21
22 int ret = chdir("/home/");//(3)改变工作目录
23 if(ret == -1)
24 {
25 perror("chdir error");
26 exit(1);
27 }
28
29 umask(0);//(4)重设文件掩码
30
31 close(STDIN_FILENO); //(5)关闭文件描述符或者重定向
32
33 open("/dev/null",O_RDWR);
34 dup2(0,STDOUT_FILENO);
35 dup2(0,STDERR_FILENO);
36
37
38 }
39
40
41 int main()
42 {
43 myDaemond();
44 while(1){};
45 return 0;
46 }
その結果、PS AUXはデーモンを確認します。
76 756 7744 1283 0.0 0.3ヤン?Ssの9時13分午後12時00 / LIB /にsystemd / systemdに--user
ヤン195 904 2584 1284 0.0 0.1≦S 9時13分午前0時(SD-PAM)
ヤン110 084 5380 1379 0.3 0.2≦R&LT sshdの午後12時9:13:PTS / 0 @ヤン
ヤン1380 0.2 0.2 29660 4932 PTS / SS 9時13分午後12時0 -bash
ヤン1406 103 4372 0.0 72? 9時14分0:04 ./daemondのRsと
ヤン1407 0.0 0.1 46772 3412 PTS / 0 R
+ 9時14分夜12時00分PSはAUX このため、ここで?これは、任意の制御端子なし、です