zuerrong 发表于 2010-12-14 09:36

webrick的强悍daemon代码

# File lib/webrick/server.rb, line 28   def Daemon.start
   exit!(0) if fork   # 1
   Process::setsid   # 2
   exit!(0) if fork# 3
   Dir::chdir("/")# 4
   File::umask(0)# 5
   STDIN.reopen("/dev/null")# 6
   STDOUT.reopen("/dev/null", "w")# 7
   STDERR.reopen("/dev/null", "w") # 8
   yield if block_given?# 9
   end# 1: 产生一次fork,并且父进程退出(parent pid为true)
# 2:执行setsid,将子进程设置为新的进程领导
# 3:接着子进程再fork一次,并且子进程退出,子子进程留下来
# 4:改变执行家目录
# 5:设置文件目录掩码
# 6-7-8:重定向输入输出到/dev/null
# 9:执行传入的block

关键技巧是这里fork了两次。
很多daemon程序,如nagios,都这么做的。
目的是为了彻底摆脱僵尸进程。

zhlong8 发表于 2010-12-14 10:12

能不能举个 fork 一次不行的例子?坚着一列看着像高级汇编一样,给力啊
页: [1]
查看完整版本: webrick的强悍daemon代码