Tiny Web服务器代码分析(3)

  Tiny通过派生一个子进程并在子进程中运行一个CGI程序,来提供各种类型的动态内容。
  程序中首先发送一个表明成功的响应行,同时还包括带有信息的Server报头给客户端。CGI程序负责发送响应的剩余部分。
  然后我们派生一个子进程,子进程用来自请求URI的CGI参数初始化QUERY_STRING环境变量,CGI程序会通过这个变量获取CGI参数值。接下来,子进程重定向标准输出到已连接文件描述符,然后加载并运行CGI程序。因为CGI程序运行在子进程的上下文中,它能够访问所有在调用execve函数之前就存在的打开文件和环境变量。因此CGI程序写到标准输出上的数据都会直接送到客户端进程,不会受到来自父进程的干涉。旗舰父进程阻塞在wait()的调用中,当子进程终止时,回收操作系统分配给子进程的资源。

void serve_dynamic(int fd, char *filename, char *cgiargs) { char buf[MAXLINE], *emptylist[]={NULL}; /*Return first part of HTTP response*/ sprintf(buf, "HTTP/1.0 200 OK\r\n"); Rio_writen(fd, buf,strlen(buf)); sprintf(buf, "Server: Tiny Web Server\r\n"); Rio_writen(fd, buf,strlen(buf)); if(Fork()==0) { setenv("QUERY_STRING", cgiargs, 1); Dup2(fd, STDOUT_FILENO); Execve(filename, emptylist,environ); } Wait(NULL); }

深入理解计算机系统(原书第2版) PDF清晰中文版 

让Tiny服务器运行起来 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/590db02cf626d91f307c850cce3d03a9.html