最后更新时间:May 24, 2019
Q1: 可以使用哪些编程语言?
A1: C 和 C++,如果有充足的理由需要使用其他语言,请自行联系助教。
Q2: 要求实现哪些响应头?
A2: 只用实现 Content-Length
。
Q3: 安全性要处理吗?
A3: 在实现时需要请求的保证访问路径不会跳出当前路径,否则可以报错,其余的安全性问题可以自行合理设计。
Q4: 如果用 epoll 还需要多进程/多线程吗?
A4: 根据自己的设计决定,不必须。
Q5: 请求目录的时候需要尝试读 index.html 吗?需要支持列目录吗?
A5: 不需要,返回 500
错误即可。
Q6:测试时资源文件大小是多少?
A6:70% 的测试数据中资源文件总大小不超过 1MiB,另外 30% 测试数据中不做假设。
Q7: 为什么重启 server 之后会连接失败?
A7: 这个问题和 socket 没有正确关闭有关,在出现这个问题时,可能通过 sudo netstat -naop4 | grep 8000
看到处于 timewait 状态的 IPv4 的 TCP 连接以及回收需要等待的时间(默认是 60s,可以 cat /proc/sys/net/ipv4/tcp_tw_recycle
查看),在此期间,因为示例程序没有设置任何 reuse 选项,新启动的程序未能成功 bind
,故无法收到请求。在调试开发期间,为了避免这个问题,可以暂时将 timewait 的回收时间 tcp_tw_recycle
改为一个较小的值,如:sudo sh -c 'echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle'
,这一改动在重启后会失效。
Q8: 如果method不是get,或者version不是1.0,就返回500是吗?
A8: 可以这么处理。
Q9: 客户端没有发完的话,read好像只读取发了的那个部分,但是我不太明白,read不应该是读到EOF为止吗?
A9: 在我们这次实验里,read 不是读到 EOF 为止,根据 HTTP 1.0 协议内容,遇到空行(出现 \r\n\r\n)就视为请求(request)的结束更为合理,之后的内容应该忽略。
Q10: read读到的最大应该是 SSIZE_MAX
个字节,如果读不完,做字符串串接还要realloc,感觉很费时,有没有好一点的方法?
A10: 绝大多数请求不会太长,可以预先开一个合理的较大的空间,如果有需要,再 realloc
Q11: 文件读到一半出错怎么办(此时已经返回 200 OK)?
A11: 本实验不考虑这个情况。对于常见服务器,它们的做法是主动将 socket 异常关闭,以告知客户端文件没有按照预期被完整传送,客户端可能会显示文件下载失败。
Q12: 访问非常规文件就要报错?
A12: 可以返回 500 错误。
Q13: 请求的如果是非文本文件,就直接500么?
A13: 当然不行。
Q1: 可以使用哪些编程语言?
A1: C 和 C++,如果有充足的理由需要使用其他语言,请自行联系助教。
Q2: 可以用 readline 库吗?
A2: 可以。
Q3: 最后必须要静态链接吗?
A3: 不必须。
Q4: 内置命令(builtin)是否需要支持重定向和管道?
A4: 尽量支持,如:pwd | cat
。
Q5: env 命令是否要做成内置命令(builtin)?
A5: 没有必要,对于有外部程序的命令,均可以使用外部程序(多数 Linux 系统都会有 /usr/bin/env
)。
Q6: 测试数据怎么设置?
A6: 最终检查时,保证 70% 的测试数据为基本测试,剩余的数据可能包含一些健壮性测试,100% 的测试文件均为测试必选内容部分,选做部分的数据另外记分。同学们可以自行设计数据对自己的 shell 进行测试;
Q7: 有什么可以参考的资料?
A7: 可以参考 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html ,但并不要求严格实现其中的很多功能。
Q1: (Lab1-2) 执行 sudo mount | grep /dev/sdc
命令发现有输出,怎样 umount
?
A1: 通过 man umount
可以看到这个命令的详细用法,或者查看 http://www.runoob.com/linux/linux-comm-umount.html
Q2: 问题探究中的问题需要回答多少?
A2: 至少一半以上,如:Lab1-2 中,至少回答 3 个问题,Lab1-3 中,至少回答 2 个问题。
Q3: (Lab1-2) 为什么在 Linux 我看到的 menuconfig
和同学看到的完全不一样?
A3: 可能是在执行 make clean
之后没有重新载入默认的 bcm2709_defconfig
配置;也可能是你关闭一些选项后,一些依赖于这些选项的选项不再显示了。
Q4: (Lab1-3) 为什么开机绿灯会有几次不规律的闪烁?
A4: 树莓派上电启动后的几秒钟内绿色 LED 会快速闪烁几次,此时的闪烁不受我们控制。
Q5: (Lab1-3) 为什么不能只向 GPIO 28-36 加偏移写入 0/1 来控制 LED 开关呢?
A5: 向 GPIO 28-36 加偏移的某个地方写入 1 只能触发「打开」动作,没有写入 1 的地方并不代表「关闭」,而是代表不触发「打开」动作,所以需要 GPIO 40-48 这 8 个字节来单独处理「关闭」的动作。