CMU 深入理解计算机操作系统 proxy lab

文章定位:写坑+叙述

lab分为三步:

 第一步:深度参考tiny.c,再自己改改就行,验证的非常粗略,我还写了很多RFC 1945里面关于细节的check,并用于火狐的代理,看到自己写的东西起码能用起来,还是很开心的。

 第二步:没实际内容,只要第一步写好,改成多线程还是挺简单的。(没在这一步遇到困难)

第三部:自己写cache,LRU,我用的是带头结点的双向链表,尾插。还要加锁pthread_rwlock。


pthread_rwlock用法:

 函数定义:https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html

 锁定义:pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

 初始化锁:pthread_rwlock_init(&rwlock, NULL);

 申请获得读锁:pthread_rwlock_rdlock(&rwlock);

 申请获得写锁:pthread_rwlock_wrlock(&rwlock);

 无论是读锁还是写锁,用完以后要释放:pthread_rwlock_unlock(&rwlock);


坑1(write-up):一直说要看RFC 1945,看完以后,发现并没啥用。还仔细看了两天。


坑2(火狐代理):习惯性的用www.baidu.com测试,但是百度用的是http/1.1 connect方法。我只实现了GET方法,后来用学校主页测试,效果很好。


坑3(从连接中读内容):两种函数带缓存的和不带缓存的。先用了带缓存的(rio_readlineb),后用了一个不带缓存的(rio_readn),结果,后面那个函数就读不到数据,因为数据已经被读到缓存里了。(好吧,这个错误的确有点脑残。后面用不带缓存的,觉得没啥必要用缓存)


坑4(pthread_rwlock):一个线程,不能同时拥有读锁和写锁,一定要先释放一种锁,再申请另一种锁。


坑5(有些回应没有content-length头部):读完头部以后,就一直读到EOF标识。这样的读法,同时解决二进制数据接收问题。


个人错误:

 1. m = (rio_writen(fd, buf, n)) == n -->  (m = rio_writen(fd, buf, n)) == n

 2. 给char 指针赋值,传入了char * --> 传入char ** (已经不是第一次了,屡教不改)

3. 更多其他....


自动测试其实很粗略,感觉很多点都没有测试到。

你可能感兴趣的:(操作系统)