通信のLinuxのデーモンプロセス

デーモン(デーモン)

デーモン(ELF)プロセスは、制御端末の通常の独立したバックグラウンドサービスプロセスのLinuxであり、定期的にいくつかのタスクを実行するか、または発生するいくつかの時間を待っ。一般的にDの終了の名前に使用。以下のプロセス情報からわかるように、デーモンは[ですか?]。

colord    1160  0.0  0.2 399424 14520 ?        Ssl  6月06   0:00 /usr/lib/colord/colord

Linuxのバックエンドサービスプロセスいくつかのシステムでは、何の制御端子が存在しない、とユーザーが直接対話することはできません。ユーザのログイン、ログアウト影響がなければ、と操作してきた、彼らはすべてのデーモンです。ftpサーバ、NFSサーバ。

デーモンを作成し、最も重要なステップは、機能がsetsidは、新しいセッション(セッション)を作成し、セッションリーダーになり呼び出すことです。

セッションとプロセスグループ

一つのプロセスグループセッション、グループセッションに対応する複数の処理よりも高いです。

そして、同じグループ内の複数のプロセスのうち、最初のプロセスは、プロセスグループのリーダーです。

(親)の頭部がセッションを作成することはできません、あなたがメンバー(子)でなければなりません作成されました。

セッション(セッション)を作成します。

図1に示すように、セッションを作成できませんプロセスは、プロセス(親プロセス)のヘッドであります

図2に示すように、成功したセッションを作成するプロセスは、プロセス(親プロセス)のヘッドになります

3、新しいセッションのプロセスは、元の端末制御を捨てます

4、、、親プロセスを終了させるフォークの最初の呼び出しを、新しいセッションを確立し、子プロセスは、関数がsetsidセッションを作成するために呼び出します

#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
DESCRIPTION
       setsid()  creates a new session if the calling process is not a process
       group leader.  The calling process is the leader  of  the  new  session
       (i.e., its session ID is made the same as its process ID).  The calling
       process also becomes the process group leader of a new process group in
       the session (i.e., its process group ID is made the same as its process
       ID).

       The calling process will be the only process in the new  process  group
       and in the new session.

なぜ普通のプロセスデーモンではないでしょうか?、最終的には共通のプロセスの実装は、この端末の実装では、あなたにすべてのプロセスを与える端末を閉じたときには信号SIGHUPを送信するので、信号の処理プロセスの黙認を中断。だから、とき端子がオフになっているので、プロセスが終了すると、デーモンになることはできません。

Signal     Value     Action   Comment
──────────────────────────────────────────────────────────────────────
SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process

デーモンを作成するには:

1、親プロセスを終了するために子プロセスを作成します

2、新しいセッションを作成するために、子プロセスでがsetsid関数を呼び出します

3、現在のプロセスのディレクトリを変更します。CHDIR機能

4、再設定されたファイルのパーミッションは、マスク。umaskの機能

5、0,1,2は、ファイルディスクリプタを閉じます。0,1,2ファイルディスクリプタ未満デーモン。資源を無駄にしないでください。

図6は、コアコードデーモンを開始しました。

7起動デーモンは、一般的にループにされているように、ここではより少ない行われます。

例:ファイルを作成し、毎分

#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

#define _FILE_ "%s/log/data_%ld"

void catc(int num){
  char* host = getenv("HOME");
  char buf[256] = {0};
  sprintf(buf, _FILE_, host, time(NULL));
  
  int fd = open(buf, O_WRONLY|O_CREAT, 0664);
  if(fd < 0){
    perror("open:");
    exit(1);
  }
  close(fd);
}
int main(){

  //创建子进程
  pid_t pid = fork();
  //关闭父进程
  if(pid > 0){
    exit(0);
  }

  //创建新会话
  setsid();

  //设置掩码
  umask(0);

  //改变工作目录
  chdir(getenv("HOME"));

  //关闭文件描述符
  close(0),close(1),close(2);

  //设置定时器
  struct itimerval it = {{60, 0}, {1, 0}};
  setitimer(ITIMER_REAL, &it, NULL);

  //捕捉信号SIGALRM
  struct sigaction act;
  act.sa_flags = 0;
  sigemptyset(&act.sa_mask);
  act.sa_handler = catc;
  sigaction(SIGALRM, &act, NULL);
  
  while(1)
    sleep(1);
}

拡張理解デーモン

通常のプロセスがデーモンになることを強制することができます。[コマンド]をnohupを使用してください。

端末を閉じているときは、その役割は、SIGHUPシグナルをブロックしている、つまり、SIGHUP信号が遮断されているので、処理は終了されることはありません。

nohup ./a.out >> a.log &

コマンド・インタプリタ:

  • ./a.out:プログラムが実行されます
  • a.logに出力をリダイレクトします
  • &:背景の意味

おすすめ

転載: www.cnblogs.com/xiaoshiwang/p/10988899.html