资源描述:
《网络编程与分层协议详情设计部分习的题目问题解释》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用标准文案第2章Linux下C编程环境习题4信号忽略是指不对该信号做出任何响应,就犹如该信号没有发生过一样,进程不对其做任何处理.信号阻塞是指若在某一时刻该信号发生了,此时内核不会将该信号发送给进程,而是将该信号保存起来,待到该函数解除对该信号的阻塞之后,再发送给该进程进行处理.在信号受到阻塞和进程解除对该信号的阻塞,但信号还未到达进程之间的时间段,进程可以任意改变对该信号的处理.当然如果到该进程结束之时如果还没有解除阻塞的话对则该信号的处理和忽略差不多习题5参见程序2_5.c习题6参见程序2_6.c习题7参见程序2_7.c和程序2_7_wit
2、hmutex.c习题8此处第8行和第10行是可以交换的.当将其交换以后,首先执行pthread_cond_signal(&mqlock_ready),此时对于另一个之前因条件不满足的线程thread2_run感知到条件变量的变化,开始获取锁.类似于调用pthread_mutex_lock(&mqlock),而此时线程thread1_run尚未解除锁,因此前一个线程thread2_run因无法获取锁而阻塞.随后线程thread1_run调用thread_mutex_unlock(&mqlock)释放锁.此时线程thread2_run得到锁,继续执行
3、.当然对于其他的程序环境是否能够交换视具体环境而定.总得来说都对,不过都有缺陷(参看《Unix环境高级编程》P697-11.4)。习题9参见程序2_9.c精彩文档实用标准文案第3章网络编程中常用的典型知识习题2参见程序3_2.c习题4structlen_and_flag{unsignedshortreserved:4,hlen:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;};习题5可以将链表节点置于宿主的固定位置,例如宿主的首个元素位置,然后通过将指向链表节点的指针强制类型转换为宿主节点的地
4、址。习题6参见程序3_6.c习题7先分析为什么要使用双向链表,而不使用单链表:考虑普通的单链表,如下:structnode{structnode*next;}假定a是某个单链表中的节点(structnodea),而b是刚定义的节点(structnodeb)精彩文档实用标准文案对于这样的链表,在指定的节点a后插入b很容易:b.next=a.next;a.next=&b;然而在指定的节点a前插入b却很麻烦;structnodehead;设head为头结点structnode*temp;temp=&head;while(temp->next!=&a)t
5、emp=temp->next;得到a的前一个节点temp->next=&b;b.next=&a;将b插入temp与a之间这就花费了一定的时间来搜索a的前一个节点,而linux要节省这部分时间.因此使用双向链表,这就决定一个节点应该含有两个指针(一个向前,一个向后)然后分析为什么prev要是用二级指针,而不使用一级指针:Linux内核中,除了有通用了双向链表,还有通用的哈希链表。后者定义与前者有些不同。因为通常一个哈希表的表头要占用很大空间,而如果每个表头都用一个双向链表来做的话,就显得太浪费了。只用一个指针可以实现相同的功能,并且可以节省一半的表
6、头存储空间.因此这就决定表头只含有一个指针(向前)哈希链表定义如下:structhlist_head{structhlist_node*first;}structhlist_node{structhlist_node*next,**pprev;}由于表头结构体hlist_head与节点结构体hlist_node的定义不一样,将使得我们的pprev指针无法直接指向hlist_head,那我们可以让其指向first。而要指向first则pprev必定为二级指针.习题8参见程序3_8.c习题9为了让notifier_chain_register函数的实
7、参能够向主程序返回该函数的处理后结果,该函数在设计上使用了2级指针。如果使用1级指针则无法通过实参带回改变后的结果。习题10精彩文档实用标准文案在3.2中的程序可以按8比特进行加运算,这两种运算在逻辑上都是可行的,但是按8bit进行加运算,其加的次数差不多是按16bit的2倍,浪费了时间第4章基础套接字习题1参见程序4_1.c习题2参见程序4_2.c习题3参见程序4_3.c习题4参见程序4_4.c习题5参见程序4_5.c习题6fprintf(stdout,"Servergotconnectionfrom%sportnumber%u",inet
8、_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));习题7第二个客户端可以