OSH-2019.github.io

常问问题

最后更新时间:May 24, 2019

Lab3

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: 当然不行。

Lab2

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 ,但并不要求严格实现其中的很多功能。

Lab1

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 个字节来单独处理「关闭」的动作。