第二章是关于POSIX以及XSI的一些标准和limitation,就不做作业了,直接到第三章,没有睡午觉,有些困,不要写错...
先贴一些比较好的思路
(1)
在AF_LOCAL(Posix: AF_UNIX)的Socket编程中,对Client端来说需要connect
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
这里需要给serv_addr一个length,这个length是一个真实的地址长度。
当socket为AF_UNIX的Socket时 socket address为sockaddr_un里面存放着地址类型以及socket path,我们需要知道sockaddr_un中真正存放数据的长度。
函数offsetof是不错的选择
这个function的实现看起来可以学习,我先抄一段贴下面
#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )
宏功能:获得一个结构体变量成员在此结构体中的偏移量。
1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员;
3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址,即相对于0的偏移量,要的就这个;
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型,size_t应该最终为unsigned int类型。
此宏的巧妙之处在于将 0 转换成(TYPE*),这样结构体中成员的地址即为在此结构体中的偏移量。
这里主要还是利用了 '->' 这个符号的功能,编译器解析这个符号的时候应该就是通过偏移量取值,所以这里先定义好取值规则(TYPE*)然后利用偏移量取值反向再取地址,再然后因为起始地址是0,取回的地址就变成了真正的偏移量。
还有一个知道member求整体的Ptr的Marco应该也蛮好用,括号比较多,我没头去看具体实现了...
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr – offsetof(type,member) );})
宏功能:从结构体(type)某成员变量(member)指针(ptr)来求出该结构体(type)的首指针。
(2)
有讨论一些东西,没有搞清楚,贴在这里以后有心力了再看,在看Rild,然后pthread在做线程同步的时候需要先lock,也许大家都是这样做,也一直这样做,但是突然就想到之前Java的时候讨论过的东西为什么wait/notify 一定要在一个synchronize block中,当然你可以讲,如果不会有exception抛出,你也还可以讲wait本来就会先释放lock然后把当前的thread放到Object waiting thread pool中然后挂起当前线程,实现就是这样子,但是从设计来讲,原因我没有想的特别清楚,如果不去lock,是不是因为wait/notify本身有很多操作没办法做multi thread...
然后就是关于select的一些辅助的Marco,类似FD_SET,FD_ZERO之类的,简单讲就是一个long数组,每个元素的每个bit代表一个fd,然后做set,clear之类的动作,最大不能超过那个1024
今天先到这里,写个序,明天正文...Orz