6.3 select 函数

给出描述符1、4、5而 maxfdp1 设置为6的原因:

maxfdp1 是值-结果参数,这里传递的是描述符的范围,类似之前的 size_of(length)。又因为描述符是从 0 开始,最大的描述符是5,所以有5 + 1 = 6个。

根据 select 文档

On exit, each of the file descriptor sets is modified in place to
indicate which file descriptors actually changed status. (Thus, if
using select() within a loop, the sets must be reinitialized before
each call.)

为什么要根据 FD_ISSET 来重新初始化?比如监听 1、4、5:

返回 1 完成了事件;

那就只需要监听剩余的 4、5了吧?怎么做?

看到后面有点明白了,通过 FD_ISSET 判断是哪个 fd 事件完成了,然后转到对应的处理代码中。

sigmask 参数

为什么会死锁?

poll

返回值

On success, a positive number is returned; this is the number of
structures which have nonzero revents fields (in other words, those
descriptors with events or errors reported). A value of 0 indicates
that the call timed out and no file descriptors were ready. On
error, -1 is returned, and errno is set appropriately.

nready = Poll(client, maxi+1, INFTIM);  

maxi+1 为 ndfs 参数,表示 the number of items in the fds array

使用  & 检查 revents 事件:

if (client[i].revents & (POLLRDNORM | POLLERR))

总结 select 和 poll

当有事件通知时,select 和 poll 都需要检查所有在检测的 fd,然后给每个 fd 写处理事件。

比如,这里分为 listenfd 和 connfd,所以 listenfd 是一种处理方法,而所有的 connfd 是一种处理方法。

习题

6.1 

将描述符集的第一个元素的指针地址赋值给另一个描述符集。

描述符集出现在 6.3节

参考答案

这个整数数组包含在一个结构中,而C是允许结构跨等号赋值的

6.2 

这里的 select 返回正值,是说明有多少个描述符满足了“可写”条件。

参考答案

为什么避免阻塞就能返回正值,阻塞完成后不会返回正值吗?

6.3 

加上 else,就变成了 else if。

那么,当满足 if (FD_ISSET(sockfd, &rset)) 之后,就不会执行 19 行的代码了。而现在的情况是,检查完 14 行的代码,还要检查 19 行的代码条件是否满足,这两个条件是不相关的。

参考答案

我的答案并没有考虑到这个是无限循环,并且 sock 并不会总是可读,所以 fp 一定会有能够执行的时候。

6.4 

获取内核允许的最多描述符数;

通过 setrlimit 将软限制设置为硬限制

   // Define and object of structure
// rlimit.
struct rlimit rl; // First get the limit on open files
getrlimit (RLIMIT_NOFILE, &rl); // Change the limit
rl.rlim_cur = rl.rlim_max; // Now call setrlimit() to set the
// changed value.
setrlimit (RLIMIT_NOFILE, &rl);

  来源:getrlimit() and setrlimit() to Control System Resources on Linux

6.5

题目麻烦,现在不想做。

shutdown

shutdown(sockfd, SHUT_RD);

MacOS 使用 tcpdump,又要学这个的用法,现在也不想学。

参考答案  

6.6

6.7

《UNIX网络编程》 -- 第六章的更多相关文章

  1. 《the art of software testing》 (1-2)章

    软件测试的心理学,重点是要认清: 测试时为发现错误而执行程序的过程 成功的测试:如果在测试某段程序时发现了错误,而且这些错误是可以修复的,就将这次合理设计并得到有效执行的测试称作是"成功的& ...

  2. 《The art of software testing》的一个例子

    这几天一直在看一本书,<The art of software testing>,里面有一个例子挺有感触地,写出来和大家分享一下: [问题] 从输入对话框中读取三个整数值,这三个整数值代表 ...

  3. 《the art of software testing》第六章

    更高级别的测试 模块测试的目的是发现程序模块与其接口规格说明之间的不一致 功能测试的目的是为了证明程序未能符合其外部规格说明 系统测试目的是为了证明软件产品与其初始目标不一致 功能测试,作者从三个方面 ...

  4. 《the art of software testing》第四章 测试用例的设计

    白盒测试 逻辑覆盖测试: 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术.它属白盒测试.白盒测试的测试方法有代码检查法.静态结构分析法.静态质量度量法.逻辑覆盖法.基本路径测试法.域测试.符 ...

  5. 《the art of software testing》 第三章 人工测试

    在深入研究较为传统的计算机测试技术之前,要先进行"人工测试". 代码检查与走查是两种主要的人工测试方法. 代码检查与走查是对过去桌面检查过程(在提交测试前由程序员阅读自己程序的过程 ...

  6. 《the art of software testing》第五章

    构建大型程序测试的第一个步骤:模块测试 测试用例的设计 在为模块测试设计测试用例时,需要两种信息:模块的规格说明和模块源代码: 模块测试总体上面向白盒测试: 模块测试的测试用例设计过程:使用一种或多种 ...

  7. 软件测试software testing summarize

    软件测试(英语:software testing),描述一种用来促进鉴定软件的正确性.完整性.安全性和质量的过程.软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对 ...

  8. JavaScript高级程序设计:第六章

    第六章 面向对象的程序设计 一.理解对象 1.属性类型: ECMAScript中有两种属性:数据属性和访问器属性. (1)数据属性: 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性 ...

  9. 第六章、Linux 的文件权限与目录配置

    第六章.Linux 的文件权限与目录配置 1. 使用者与群组 2. Linux文件权限概念 2.1 Linux文件属性 2.2 如何改变文件属性与权限: chgrp, chown, chmod 2.3 ...

  10. 第六章:Reminders实验:第二部分[Learn Android Studio 汉化教程]

    Learn Android Studio 汉化教程 Reminders Lab: Part 2 This chapter covers capturing user input through the ...

随机推荐

  1. 图解avaScript中this指向(超透彻)

    一个图讲清楚JavaScript中this指向: 说明: (1)严格模式下,禁止this关键字指向全局对象会报错. (2)闭包中的this对象具有全局性,因此通常指向window.  (3)优先级:n ...

  2. java中string和int互相转化 (转)

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  3. spring中反射机制和注入的使用

    http://www.cnblogs.com/andin/archive/2011/04/30/spring.html spring的一大核心概念是注入, 但是,这存在的一个前提就是类是由spring ...

  4. ZOJ 3827 Information Entropy (2014牡丹江区域赛)

    题目链接:ZOJ 3827 Information Entropy 依据题目的公式算吧,那个极限是0 AC代码: #include <stdio.h> #include <strin ...

  5. PE下挂载注册表文件然后清除系统托盘空白图标缓存

    清除了右下角通知栏图标缓存TrayNotify(否则会出现一堆空白图标)清除缓存批处理脚本.bat如何在PE系统环境下清除宿主系统的托盘图标缓存? 清除了右下角通知栏图标缓存TrayNotify(否则 ...

  6. android动画具体解释二 属性动画原理

    property动画是一个强大的框架,它差点儿能使你动画不论什么东西. 你能够定义一个动画来改变对象的不论什么属性,不论其是否被绘制于屏幕之上. 一个属性动画在一定时间内多次改变一个属性(对象的一个字 ...

  7. Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc

    Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc 1. 俩个问题::识别垃圾文件与清理策略1 1.1. 文件类型:pic,doc,v,m cc,isho pose ...

  8. Redis命令学习-string类型操作

    APPEND key value     假设key已经存在,而且为字符串.那么这个命令会把value追加到原来值的末尾.假设key不存在.首先创建一个空字符串,再运行追加操作.     返回值:返回 ...

  9. 2. Add Two Numbers【medium】

    2. Add Two Numbers[medium] You are given two non-empty linked lists representing two non-negative in ...

  10. python-class(5)

    #!/usr/bin/env python #-*- coding:utf-8 -*- ############################ #File Name: class5.py #Auth ...