深入理解计算机系统(第二版) 家庭作业 第十一章


11.6
A. 因为read_requesthdrs中已经打印出了请求报头,所以只要打印请求行即可。在doit函数中第一个sscanf语句之后添加下面的语句即可:printf("%s %s %s\n", method, uri, version);
B. 用火狐浏览器输出结果:

另外,如果要存成文件的话,可能需要另存为?
C. A的结果可以表明,浏览器使用HTTP/1.1
D. 请求行和报头如下:
GET /clockwise.gif HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

User-Agent: 系统以及浏览器情况
Accept:可以接受的媒体;
Accept-Encoding:可以接受的编码方案;
Accept-Language:能够接受的语言;
其实上述内容是百度得到的大笑


11.7
在get_filetype函数里面添加
else if(strstr(filename, ".mpg") || strstr(filename, ".mp4"))
     strcpy(filetype, "video/mpg"); 


11.8
并没有想到很好的方法。
因为结束子进程之前,我们不可以关闭已连接描述符。这就导致我们还是得让serve_dynamic或者是doit函数或者main函数中要等待子进程结束。迭代服务器的设计让这个问题变得比较无聊。
在main函数之前加入代码:
int chdEnded ;
#include <signal.h>
void child_signal(int sig)
{
    pid_t pid;
    while((pid = waitpid(-1, NULL, WNOHANG)) > 0)
    ;
    chdEnded = 1; 
在main函数中添加语句 signal(SIGCHILD, child_handle);
每次accept之前,让chdEnded = 0;
并且在doit()中的serve_dynamic之后添加:
while(!chdEnded) pause();//or do sth
删掉serve_dynamic里的wait(NULL);


11.9
serve_static中的存储器映射语句改为:
srcfd = open(filename, O_RDONLY, 0);
srcp = (cha
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值