lighttpd代码阅读笔记(一) watcher-worker模式

本文为lighttpd服务器的代码阅读笔记第一篇,重点探讨其watcher-worker模式。lighttpd以其高效简洁的设计在开源服务器中脱颖而出,虽在国内大型网站应用较少,但3.8万行的代码量使其成为学习的理想资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lighttpd是当前众多开源的服务器中比较优秀的一个,虽然说国内的很多大型网站

如:新浪、淘宝等都没有采用,但是它的设计巧妙精简,效率高,整个项目代码大约在3.8w左右,是非常好的学习材料,

	/*lighttpd服务器采用的是watcher-worker模式,其中watcher是主进程,worker是由主进程fork的
	子进程,watcher主要有2个作用,
	第一:根据用户预先设定的最大worker值来fork子进程(worker),其中这个值是在配置文件中的
	第二:监控worker进程的工作情况,如果有worker进程,那么watcher就会创建新的worker进程*/

	/*此段代码在server.c文件的main函数中*/
#ifdef HAVE_FORK
	/* start watcher and workers */
	num_childs = srv->srvconf.max_worker;/*num_childs保存了所要创建worker进程的数量*/
	if (num_childs > 0) {/*num_childs>0,有需要创建的worker进程*/
		int child = 0;/*child=0,表示是wather进程,即父进程*/
		while (!child && !srv_shutdown && !graceful_shutdown) {
			if (num_childs > 0) {
				switch (fork()) {
				case -1:
					return -1;
				case 0:
					child = 1;
					break;
				default:
					num_childs--;
					break;
				}
			}
			else {
				int status;
				/*所有的worker进程已经创建完成,watcher进程调用wait函数进入阻塞状态*/
				if (-1 != wait(&status)) {
					/**
					* one of our workers went away
					*/
					/*当离开阻塞状态的时候,表示有worker进程退出,num_childs++,由watcher进程在
					创建一个worker进程*/
					num_childs++;
				}
				else {
					/*受到中断信号的处理,可能是watcher收到了退出服务器的信号*/
					switch (errno) {
					case EINTR:
						/**
						* if we receive a SIGHUP we have to close our logs ourself as we don't
						* have the mainloop who can help us here
						*/
						if (handle_sig_hup) {
							handle_sig_hup = 0;

							log_error_cycle(srv);

							/**
							* forward to all procs in the process-group
							*
							* we also send it ourself
							*/

							/*向所有的worker进程发送SIGHUP信号,这个信号由信号函数捕获并处理*/
							if (!forwarded_sig_hup) {
								forwarded_sig_hup = 1;
								kill(0, SIGHUP);
							}
						}
						break;
					default:
						break;
					}
				}
			}
		}

		/**
		* for the parent this is the exit-point
		*/

		/*在正常的运行下,watcher进程不会执行到这里,执行到此处时,watcher即将退出,并在
		退出之前做一些清理工作*/
		if (!child) {
			/**
			* kill all children too
			*/
			if (graceful_shutdown) {
				kill(0, SIGINT);
			}
			else if (srv_shutdown) {
				kill(0, SIGTERM);
			}

			log_error_close(srv);
			network_close(srv);
			connections_free(srv);
			plugins_free(srv);
			server_free(srv);
			return 0;
		}
	}
#endif

	/*lighttpd  由watcher(主进程)创建多个worker(子进程),之后,watcher一直监控worker的工作情况,并在
	worker退出之后(可能是异常原因退出),worker再次创建worker,保证固定数量的worker,worker在创建之后就进行
	自己的任务,与其他的worker互不干扰,才有这种watcher-worker多进程的方式,简化了编程的复杂性<span style="font-family: Arial, Helvetica, sans-serif;">,如果是采用</span>
	多线程的方式,就必须得考虑同步异步情况*/

参考了一个不错的博客: lighttpd1.4.18代码分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值