バリケンのRuby日記 RSSフィード

2006-06-09

[] QuickMLソースコードを読む(2) /usr/sbin/quickmlの続き  QuickMLのソースコードを読む(2) /usr/sbin/quickmlの続き - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  QuickMLのソースコードを読む(2) /usr/sbin/quickmlの続き - バリケンのRuby日記  QuickMLのソースコードを読む(2) /usr/sbin/quickmlの続き - バリケンのRuby日記 のブックマークコメント

昨日のエントリの続きだよ。

check_directoryメソッド

def check_directory (dir)
  error("#{dir}: No such directory") unless File.directory?(dir)
  error("#{dir}: is not writable")   unless File.writable?(dir)
end

これは、ディレクトリをチェックするcheck_directoryメソッドの定義だね。File::directory?メソッドで引数で指定したディレクトリをチェックしてディレクトリ存在しないときと、File::writable?メソッドで引数で指定したディレクトリをチェックして書き込み不可のときに昨日のエントリで見たerrorメソッドを使ってエラーを出力するよ。

be_daemonメソッド

def be_daemon
  exit!(0) if fork
  Process::setsid
  exit!(0) if fork
  Dir::chdir("/")
  File::umask(022)
  STDIN.reopen("/dev/null",  "r+")
  STDOUT.reopen("/dev/null", "r+")
  STDERR.reopen("/dev/null", "r+")
end

これは、自身のプロセスデーモン化するbe_daemonメソッドだね。「Rubyレシピブック 268の技」の「レシピ221 デーモンになる」で紹介されているdaemonメソッドと基本的には同じだね。

まずKernel#forkメソッドでforkすることで、自分がプロセスグループリーダーではないことを保障するよ。次にProcess::setsidメソッドで制御端末を切り離したあと、制御端末を再び得ることがないように、もう一度forkしているよ。さらにDir::chdirメソッドでカレントディレクトリを安全な場所("/")に移動して、File::umaskメソッドで以降で生成するファイルumaskを022に設定するよ。最後にIO#reopenメソッドで標準入力標準出力標準エラー出力を/dev/nullに設定してデーモン化が完了するよ。

ちょっと気になるのが、クラスメソッドを「::」とするコーディングスタイル。最近のコーディングスタイルに合わせるなら、「.」にしたほうがいいかも。

touchメソッド

def touch (filename)
  File.safe_open(filename, "a").close
end

これは、空のファイルを作るtouchメソッドの定義だね。引数で指定したファイルを開いて閉じることで、空のファイルが作られるよ。ちなみにFile#safe_openメソッドは/usr/lib/ruby/1.8/quickml/utils.rbで定義されているよ。

今日はここまで。