// 监听端口
open_listenfd()
// 不断循环
while(1) {
// 新连接
fd = accept()
// 处理连接
doit(fd)
}
// 处理连接
doit() {
// 读http header
Rio_readline()
// 解析uri
parse_uri()
// 如果是静态内容,则验证该文件是静态文件,然后返回文件内容
serve_static()
// 如果是动态内容,则验证该文件是可执行文件
serve_dynamic()
}
// 处理动态内容
serve_dynamic() {
// 创建子进程
Fork()
// 设置uri参数到环境变量
setenv()
// 重定向子进程标准输出到描述符fd
Dup2(fd, STDOUT_FILENO)
// 运行可执行文件
Execve()
// 父进程等待子进程结束
Wait()
}
同时知道listenfd监听描述符和readfd读描述符是否准备好,并做相应处理
Open_listenfd()
init_pool()
while(1) {
select()
if(listenfd) {
Accept()
// 新连接
add_client()
}
// 处理连接
check_clients()
}
Open_listenfd()
while(1) {
Accept()
Pthread_create()
}