进程模型--lighttpd

来源:互联网 发布:网络聚众赌博怎么处罚 编辑:程序博客网 时间:2024/05/18 20:12
一. Server

原则,处理都是在主处理中根据标志位进行分发和调用

1. 初始化
   环境 //setlocale(LC_TIME, "C"); /* for nice %b handling in strfime()  C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,是用来书写C语言源程序的最小字符集*/
   关闭控制台 //STDIN_FILENO STDOUT_FILENO tmpfd = open("/dev/null", O_RDWR);        dup2(tmpfd, fd);close(tmpfd);
   PID
   rlimit 设置CORE和NOFILE
   进程切换用户为配置指定用户
   网络初始化// listen端口,ssl加载,句柄注册
   设置最大连接数//不超过max_fds/2,默认max_fds/3

   初始化插件


2. daemonize


3. 初始化信号量处理
   SIGPIPE 忽略;系统默认行为是退出,sendfile会导致这个触发
   SIGUSR1 忽略;
   SIGTERM 强制退出
   SIGINT  graceful退出
   SIGALRM 定时器

   SIGHUP 调用相关插件//系统对SIGHUP信号的默认处理是终止收到该信号的进程


4. 初始化定时器


5. 启动工作进程
   while (!child && !srv_shutdown && !graceful_shutdown)
   只要不关闭,父进程都会阻塞在这个循环中wait子进程,然后保证子进程的数量
   收到ENITR如果配置forwarded_sig_hup会kill(0, SIGHUP)给子进程
   退出时也会根据grace已否kill 0给子进程
   

   父进程就是控制进程(watcher),到此为止了,下面活动是子进程的

  

6. 初始化2阶段
   反应式模型// 根据配置对select/poll/epoll等不同方式进行处理

   初始化stat_cache //对stat(),即文件大小,修改时间信息结果进行缓存  


7. 主处理循环
 
   1) 信号量标志处理
           先调用plugins
      handle_sig_hup
      handle_sig_alarm
          清理stat_cache
          对读、写、关闭等操作异常情况进行更新其状态((srv->cur_ts - con->read_idle_ts > con->conf.max_read_idle))
          流控进行处理
   //2) 特定平台等待部分fid
   3) 遍历joblist
      依据每个job状态进行处理

      plugins处理


二. Mod

cgi, fastcgi,scgi,

ssi

rrdtool等

都会启动另外进程


PS: lighttpd的fastcgi这个紧凑,简单的东西已经独立出来,提供其他动态语言接入端使用了。

原创粉丝点击