developer's diary

最近はc#のエントリが多いです

C初心者がmemcached-1.4.5を追いかける。(19)

C初心者がmemcached-1.4.5を追いかける。(18)の続き
ソースはコチラにてDLしました。

getoptで受け取ったパラメータによって処理を行っている部分を追いかける。

memcached.c(4369行目あたり)

        case 'P':
            pid_file = optarg;
            break;
          "P:"  /* save PID in file */

pid_file はmainのローカル変数。

    char *pid_file = NULL;

プロセス管理の為に使うファイルでしょうか。

起動時にPIDファイルを生成

memcached.c(4614行目あたり)

    if (do_daemonize)
        save_pid(getpid(), pid_file);

dオプションで起動した場合に、save_pidで書き込んでいます。

getpid()はプロセスIDを取得するシステムコール 404 - エラー: 404
memcached.c(4166行目あたり)

static void save_pid(const pid_t pid, const char *pid_file) {
    FILE *fp;
    if (pid_file == NULL)
        return;

    if ((fp = fopen(pid_file, "w")) == NULL) {
        vperror("Could not open the pid file %s for writing", pid_file);
        return;
    }

    fprintf(fp,"%ld\n", (long)pid);
    if (fclose(fp) == -1) {
        vperror("Could not close the pid file %s", pid_file);
        return;
    }
}

終了時にPIDファイルを取り除く

mainの終わりの方でpid_file変数が使用されていました。
memcached.c(4686行目あたり)

    /* remove the PID file if we're a daemon */
    if (do_daemonize)
        remove_pidfile(pid_file);

memcached.c(4183行目あたり)

static void remove_pidfile(const char *pid_file) {
  if (pid_file == NULL)
      return;

  if (unlink(pid_file) != 0) {
      vperror("Could not remove the pid file %s", pid_file);
  }

}

unlink(システムコール)でファイルを削除しています。 404 - エラー: 404

PIDファイルとは(apacheの解説)

memcachedなのになぜかapacheですが。あくまでほかのプログラムならということで。

実行時のプロセスID番号が分かると便利だ。Unix、Win32とも、この情報はPidFileで調べることができ、このディレクティブを設定するとPIDを格納する場所を変更できる。
・・・・
しかし、PIDを使って簡単にプロセスを停止できるのはUnixだけである。

(Apache ハンドブック 第3版 P.64ページより。)



実際memcachedではどのようにPIDを使っているのでしょうか。

プロセスをkillする場合。

試してませんが

kill -HUP `cat [Pオプションで指定したファイル]`

こんな感じでしょうか。