器重考虑到的难题正是对输入参数命令行选项的拍卖,机械工业出版社

对此IPerf源码解析,我是基于贰.0.伍本子在Windows下举行的事态举办分析的,提倡发轫先经过对源码的简约修改使其可以在地头编写翻译器运维起来,那样能够打字与印刷输出壹些中路音讯,对于明白源码的逻辑,程序实现的长河能够起到一石多鸟的功用。

《UNIXLinux程序设计教程》
核心音讯:
作者: 赵克佳 沈志宇
丛书名: 原创精品类别
出版社:机械工业出版社
ISBN:9787111403890
上架时间:二〇一二-1二-5
出版日期:20一三 年5月
开本:16开
页码:1
版次:一-1 所属分类: 计算机 > 操作系统 > Linux
图片 1
越来越多关于
》》》《UNIXLinux程序设计教程

IPerf主要分为如下多少个模块:

内容简介:
电脑书籍
  《unix/linux程序设计教程》遵守最新的“统1unix规范版本四”,以linux为平台,系统地讲述了unix
api各类函数的编制程序方法。本书内容包含unix的进化进度与行业内部、标准i/o和低级i/o、文件与目录操作、进度环境与经过控制、实信号处理、时间与定时、终端i/o、高级i/o、进度之间的通讯、套接字与互联网通讯、八线程编制程序。
  《unix/linux程序设计教程》在介绍unix
api各样函数的效应和用途的同时,清晰地论述了它们所包含的操作系统基本原理。书中付出了大气先后设计示例程序,有助于读者越来越好地左右这么些函数的机能、使用方法及编制程序技巧。
  《unix/linux程序设计教程》尤其吻合于高校总括机专业的教育工作者、高年级本科生、学士作为教材和参考书,也专程契合从事电脑连串软件和使用软件开发的工程技术人士作为实用编制程序手册查阅。
目录
《unix/linux程序设计教程》
前言
第1章 
unix导论 1
1.1 unix简史 1
1.1.1 unix的诞生 1
一.一.二 unix的早期发展 贰
1.1.3 bsd unix 3
1.1.4 系统v unix 3
一.一.五 unix的商业化 四
1.1.6 linux 4
1.2 标准 5
1.2.1 svid 5
1.2.2 posix 6
1.2.3 统一unix规范 6
1.2.4 c标准 8
1.3 unix基本概念 捌
一.三.一 程序和经过 八
1.3.2 内核 9
1.3.3 shell 10
一.叁.肆 用户名与用户id、用户组与组id 1贰
 一.三.伍 特权用户 12
一.3.陆 系统调用与库函数 1二
1.4 系统库 13
1.4.1 头文件 14
1.4.2 保留字 14
一.四.三 特征测试宏 一伍
一.5 示例程序和编译环境 16
一.六 错误处理 17
一.7 系统音讯 1九
一.柒.一 机器标识 1九
一.柒.二 硬件/软件项目识别 19
一.八 系统能力范围 20
一.八.1 壹般能力范围值 二壹
1.八.二 系统和文书特征选项 2二
1.8.3 sysconf()、pathconf()和fpathconf()函数 23
1.玖 思索与演习 二柒
第一章 标准输入输出 2八
二.一 unix 输入输出骨干概念 28
2.2 流和file对象 30
2.三 打开和倒闭流 31
2.四 读和写流 3三
2.4.1 字符i/o 33
2.4.2 行i/o 34
2.4.3 读回退 37
2.4.4 块i/o 38
二.五 文件定位 40
二.六 文件结束和不当提醒器 4二
2.7 流缓冲 43
2.8 格式i/o 46
二.8.一 格式输出 四柒
贰.捌.二 格式输入 50
二.玖 临时文件 5三
二.十 思量与演练 5伍
第2章 低级输入输出 5陆
三.壹 文件讲述字的开拓、成立和关闭 5陆
3.2 read()和write()函数 60
3.三 设置描述字的公文地方 陆1
3.4 dup()和dup2()函数 64
3.5 fdopen()和fileno()函数 65
3.6 文件决定函数fcntl() 陆伍
③.⑥.一 重复文件讲述字 6六
叁.陆.贰 文件讲述字标签 6七
三.6.3 文件状态标签 6八
3.7 非阻塞i/o 71
3.8 readv()和writev()函数 73
3.9 fsync()和fdatasync()函数 74
3.10 思量与练习 75
第6章 文件与目录 7七
4.1 文件 77
4.1.1 stat()、fstat()和lstat()函数 78
4.2 文件类型 79
四.2.1 普通文书 79
4.2.2 目录 80
4.2.3 链接与link()函数 80
4.二.四 符号链接与symlink()和readlink()函数 捌二
四.二.伍 尤其文件 八三
肆.2.陆 测试文件的品种 捌四
四.三 文件的属主和用户组 八⑤
4.3.1 chown()、fchown()和lchown()函数 86
4.四 文件措施 8柒
四.4.一 文件访问权限 8捌
4.四.二 调整用户id和调动组id 8九
4.4.3  sticky位 90
肆.四.四 文件方式位小结 九一
四.伍 鲜明和改动文件措施 九二
4.5.1 umask()函数 92
4.5.2 chmod()和fchmod()函数 94
4.5.3 access()函数 94
四.六 文件大小 九陆
四.陆.壹 截断文件 九七
四.七 文件时间 9玖
4.7.1 utime()和utimes()函数 99
四.八 文件的去除与换名 10一
四.捌.壹 删除文件和目录 10壹
肆.捌.二 文件换名 10三
四.九 目录操作 104
四.玖.一 工作目录 拾4
四.九.二 创造目录 拾伍
4.玖.3 读目录流 十6
4.九.肆 对目录流的任意访问 10玖
④.10 思索与演练 10玖
第肆章 进度环境 111
5.1 main()函数 111
伍.贰 命令行参数 11一
五.二.1 命令行参数的语法约定 11二
5.二.贰 扫描命令行中的选项 1一三
5.叁 环境变量 1一伍
5.3.1 环境表 116
5.叁.二 访问环境 1一7
5.四 终止进度 11八
伍.4.一 出口情况 119
伍.四.二 终止前的清理 11玖
五.四.三 早产程序 120
5.5 进度的积存空间 1二1
5.伍.1 进度的地点空间 122
伍.五.二 动态存款和储蓄分配与自由 1二叁
伍.5.三 释放分配的存款和储蓄单元 1贰陆
5.6 setjmp()和longjmp()函数 127
5.柒 进度财富 130
伍.7.一 查看与安装能源限制 131
5.7.二 能源采用总括 13二
伍.8 用户新闻 133
5.8.1 用户名 133
五.八.2 用户数据库 13四
5.8.三 组数据库 136
伍.玖 进程的地位凭证 13玖
五.10 调整进度的身份 1肆一
伍.11 思虑与演练 14六
第六章 进程序控制制 14七
陆.一 进度标识 1肆七
陆.2 进度创设 14八
六.三 执行1个新程序 15壹
六.四  等待进程完结 15伍
6.伍 进度终止与僵死进程 15玖
6.6 system()函数 163
6.7 进程组 164
6.8 会晤期 165
6.玖 控制终端 16陆
6.十 作业控制 16八
陆.1壹 考虑与演练 17四
第七章 随机信号处理 17五
七.一 时限信号概念 175
7.2 unix 信号 177
7.二.壹 程序错误类时限信号 17玖
七.二.2 程序中止类随机信号 180
7.二.三 机械钟类确定性信号 180
7.2.4 i/o类信号 180
7.2.伍 作业控制类连续信号 1捌一
柒.二.陆 操作不当类时限信号 18一
柒.贰.七 其余随机信号 1捌二
七.三 生成功率信号 1八二
7.3.1 raise()函数 182
7.3.2 kill()函数 183
七.四 设置复信号的动作 1八四
7.4.1 signal()函数 184
柒.四.2 进程初启时的时限信号动作 1八六
柒.四.3 不保证实信号 187
7.4.4 sigaction()函数 188
7.伍 时限信号句柄 19一
柒.五.1 平日再次来到的实信号句柄 1玖二
七.5.贰 终止进度的句柄 1⑨2
七.六 阻塞复信号 1玖三
7.6.1 sigset_t类型和功率信号集操作 1九三
柒.陆.2 设置功率信号屏蔽 19肆
7.六.三 检查悬挂时限信号 1玖陆
7.柒 等待功率信号 197
7.7.1 pause()函数 197
7.7.2 sigsuspend()函数 198
七.八 使用分别的信号栈 201
7.玖 连续信号句柄编制程序技巧 20肆
柒.九.一 句柄内非局地控制转移 204
7.九.二 可重入函数与异步能量信号安全函数 207
柒.玖.三 被随机信号中断的连串调用 二拾
7.九.4 原子数据 21壹
七.十 实时数字信号 21二
7.10.1 sa_siginfo标志 213
七.十.2 发送实时数字信号 二一7
7.拾.三 等候实时确定性信号 21九
柒.1一 思索与练习 2二一
第天问 时间与定时 22二
八.1 系统时钟 22二
8.1.1 time()函数 222
8.1.2 gettimeofday()函数 223
捌.二 时间格式转换 224
八.二.一 分解的日历时间 224
八.贰.二 格式化日期与时间 227
捌.三 cpu时间与墙钟时间 22玖
8.3.1 clock()函数 230
8.3.2 times()函数 231
八.四 睡眠与定时 23三
8.4.1 sleep()函数 233
8.四.2 设置定时器 233
8.伍 实时石英钟与定时 二3柒
八.5.一 实时时钟 23八
八.5.二 实时睡眠 240
八.伍.三 实时定时器 二四一
8.五.四 创造和删除实时定时器 2四一
8.五.伍 设置实时定时器 二四三
八.伍.6 定时器超期计数 24四
8.陆 思量与演练 贰四陆
第9章 终端i/o 247
玖.一 须求变更终端安装的例证 247
9.2 终端i/o概述 249
9.2.1 终端 249
九.二.2 串行端口 250
九.2.三 终端设备文件 25二
9.二.4 输入输出队列 25二
九.贰.5 加工和非加工输入方式 25三
玖.3 gti控制接口 254
九.3.一 termios数据结构 254
玖.叁.贰 gti控制函数 25五
九.四 终端属性 25陆
九.肆.壹 输入格局 256
九.四.贰 输出格局 257
9.四.三 控制情势 25捌
九.四.4 局部方式 25九
九.四.5 特殊字符 260
9.4.6 stty命令 263
9.五 终端标识 二陆三
九.陆 改变终端属性 265
玖.七 加工方法与非加工方法输入 266
玖.七.一 加工方法输入 266
九.7.贰 非加工方法输入 二陆七
9.8 设置Porter率 272
9.玖 行控制函数 27三
玖.十 串行端口程序设计 27伍
九.1一 思虑与练习 27八
第10章 高级i/o 279
10.1 文件锁 279
十.一.一 fcntl()文件锁操作 280
10.一.二 锁的测试、请求和刑满释放 2八二
十.1.3 文件锁与经过和文件的关系 28六
10.1.4 死锁 287
10.一.5 建议锁与强制锁 28八
十.2 时域信号驱动的i/o 28玖
十.3 多路转接i/o 2玖壹
10.3.1 select()函数 291
10.3.2 poll()函数 294
10.4 异步i/o 296
10.4.1 异步i/o控制块 297
十.四.2 i/o完毕时的实信号交付 2九8
十.四.3 异步i/o的先期级 299
10.4.4 异步i/o函数 299
10.4.5 异步i/o之例 304
十.4.六 异步i/o注意事项 30柒
十.伍 存储映射i/o 30八
拾.6 考虑与演练 31肆
第2壹章 进度间通讯 31六
11.1 管道 316
11.一.一 创制管道 3一7
1壹.一.二 老爹和儿子进度间的管道通讯 317
1一.一.三 连接标准输入和专业输出的管道 31玖
11.1.4 popen()和pclose()函数 321
11.一.伍 管道i/o的原子性 32贰
1一.2 fifo特别文件 3二三
11.2.1 创建fifo 323
11.2.2 fifo操作 325
1一.二.三 fifo用于客户/服务通讯 328
11.3 系统v ipc 331
1一.叁.一 关键字和标识 332
1壹.三.贰 ipc能源描述结构与成员ipc_perm 333
11.3.3 ipcs和ipcrm命令 334
11.四 音信队列 334
11.4.1 成立和收获音讯队列 33陆
1一.四.二 新闻队列的询问、设置和删除 337
11.4.三 发送和吸收音讯 33玖
1壹.五 共享存款和储蓄段 3肆三
11.5.一 成立和获取共享存款和储蓄段 3四三
1一.5.2 共享存款和储蓄段的询问、设置和删除 344
11.五.叁 共享存款和储蓄段的连天和分手 345
11.6 信号量 347
1壹.6.一 创立和获得随机信号量标识 348
11.6.二 功率信号量的询问、设置和删除 350
1壹.陆.3 功率信号量操作 352
1一.7 思量与演习 3伍7
第22章 套接字与网络通信 358
12.1 tcp/ip协议 358
12.2 套接字 360
12.3 套接字地址结构 36四
12.3.1 ip地址 364
12.三.二 域名地址 36六
1二.叁.三 服务与端口号 369
1二.3.四 套接字地址数据结构 37一
12.三.5 字节顺序 37三
1贰.4 命名套接字 37四
1二.伍 套接字通讯形式 377
1二.陆 流套接字操作 37九
1贰.陆.一 请求连接 37九
1二.陆.二 接收连接 3捌一
12.6.3 getsockname()和getpeername()函数 385
12.6.4 多客户服务 3八陆
12.6.5 send()和recv()函数 388
1二.七 套接字选项 390
12.八 带外数据 3九贰
1二.八.一 tcp带外数据 3玖二
1二.8.二 带外数据的出殡和埋葬和接收 3九三
1二.八.叁 带外数据标志 3九七
1贰.9 数据报套接字操作 39九
12.9.1 sendto()和recvfrom()函数 399
12.九.二 数据报套接字客户/服务之例 400
12.9.3 使用connect()函数 403
1二.10 超时处理 40四
1二.1壹 思索与演习 405
第13章 线程 406
壹叁.1 线程概念 40陆
一三.壹.一 什么是线程 406
一三.一.二 线程的益处 409
13.1.3 pthreads线程 412
一三.1.④ 线程标识 肆一三
一3.二 创造线程 41四
1三.3 终止线程 四壹伍
一叁.三.一 等待线程终止 416
1三.三.2 可统一与分离的线程 41捌
壹3.四 创立特殊质量的线程 420
一3.五 互斥变量 4二5
壹三.五.一 互斥变量的伊始化和销毁 4贰七
一三.伍.贰 互斥变量属性 42八
一3.⑤.三 互斥变量的加锁与解锁 431
一三.5.四 互斥变量与spin锁 433
13.6 读写锁 435
一三.六.一 读写锁的初步化和销毁 435
一叁.陆.2 读写锁的上锁与解锁 43陆
一三.七 条件变量 43玖
一叁.柒.壹 成立和销毁条件变量 44一
一三.柒.2 条件变量属性 4四一
一三.7.3 等候条件变量 4四三
一三.七.4 晋升条件变量等待 4四五
一3.八 考虑与演练 448
第一肆章 线程高级特征 450
1四.一 线程专有数据 450
1肆.1.壹 线程专有数据键的创办和删除 45一
1四.一.二 使用线程专有数据 45肆
1四.二 撤除线程 456
14.二.一 线程的独到之处消属性 457
1四.贰.贰 撤废线程与废除点 45八
1四.二.3 异步撤废的平安性 四陆1
1四.2.肆 现场清理 46二
1四.三  线程调度 464
1四.3.1 线程调度竞争范围 465
1四.三.二 调度策略与先行级 肆陆七
1四.3.3 线程调度属性 46玖
1四.三.四 动态改变线程的调度策略和预先级 47一
1四.四 线程与数字信号 47四
1四.四.1 功率信号动作 474
14.四.贰 时域信号屏蔽 47伍
1肆.肆.3  向线程发送非数字信号 476
1四.四.4 等候能量信号 477
14.四.伍 一种新的轩然大波通报方法:sigev_thread 480
1肆.5 考虑与练习 4八3 参考文献 48四

  • 分选参数处理;
  • 线程封装和剧中人物扮演;
    • 多样线程形式(可能说剧中人物):
      • 客户端线程;
      • 服务端线程;
      • 报告者线程;
      • 监听者线程。
  • 套接字选项设置与提取;
  • 链表和数组的卷入和珍爱;
  • 拍卖多并发Condition条件变量的卷入;
  • 时光戳封装;
  • Windows下作为后台服务运作的创办和平运动行。

图书新闻来源:中华互动出版网

上边尽可能针对各类模块进行验证:

慎选参数的拍卖:

用作命令行控制台应用程序,重要考虑到的标题正是对输入参数命令行选项的拍卖,假设是简不难单的应用程序直接通过case-switch或然if条件语句可能能够解决,然而假设到了规模较大,实现内容比较复杂的控制台应用程序,比如IPerf,依旧用该处理办法就展现相对工巧,在性质、逻辑处理等地方都有所不比。

对此选用参数的拍卖,IPerf使用的GUN的3个getopt文件,在Linux下已有该头文件,而在Windows要求团结导入该头文件和兑现文件,参加文件从此,还亟需做的就是对文件中的壹些长选项和短选项字符串进行拍卖,因为那是上下一心定义的要求,处理选项参数的逻辑是迟早的,不过要将何以内容作为客观的选项和参数以及操作数,那多少个又是不法的字符和得不到识别的操作数,程序需求因而进行判断,所以须要开始展览二个初步化的进程,前边在运用的进度中调用相应的接口对主函数字传送进来的args和argv[]用作输入参数举行处理就行了,越来越多关于采纳参数的拍卖,能够看看该篇文章,也许机关网上找寻。

 

先后的首要模块正是剧中人物线程的变型、运转和销毁,别的模块包涵时间戳、条件变量、维护的链表等都以为此服务的,所以那里打算先说一下任何模块然后在每种分析区别品种的线程。

 

套接字选项的包装和装置:

说套接字选项从前还亟需先说一下套接字的转移,IPerf对套接字Socket的生成定义了3个名叫WIN3二Socket的宏,那几个宏内部调用了WSASocket,而套接字的习性和研讨项目是透过定义WSAPROTOCOL_INFO类型静态函数,并将该函数作为输入参数字传送到WASSocket实现的。

PerfSocket.cpp中只有二个名称为SetSocketOptions的函数,顾名思义正是用来设置套接字选项的值,函数里面包罗设置TCP滑动窗口大小(setsock_tcp_windowsize函数在另三个名称叫tcp_window_size.c的文本中独立完成)、设置拥挤堵塞控制、设置多播、设置IP服务类型(那一个很少用获得)、设置最大报文段大小(setsock_tcp_mss函数在sockets.c文件中贯彻)、设置非延迟等。当然,除了安装套接字选项外,也有获得相应选项的函数,比如getsock_tcp_windowsize和getsock_tcp_mss。

在SocketAddr.c文件中,IPerf定义了1多级以“SocketAddr_函数功效”格式命名的函数,通过宏条件判断是不是帮忙IPV陆,定义了包蕴:通过IP地址获取到可能说转换到对端的套接字地址结构,将互连网序转成点分10进制,获取和设置端口值等,围绕着定义的iperf_sockaddr类型(IPV4下为sockaddr_in类型,IPV6下为sockaddr_storage)判断该套接字地址是或不是同样等。

 

链表和数组的保证和包装:

IPerf在促成人中学创制了三种不一样档次的链表和数组:在上未时的线程链表,报告选择的报告者首部链表,监听(者)线程维护的客户端链表,紧接在传送类型报告者首部前边的包数组,在服务端和多并发客户端维护的多组报告首部维护的传导新闻数组。具体的下一场会详细描述到,List.cpp封装对Iperf_ListEntry类型链表的增删查和销毁操作,而该链表仅是监听者用来储存和掩护已接连客户端的音信,别无它用。

 

拍卖多并发Condition条件变量的包装:

Condition是IPerf自身包裹的结构体,变量mCondition为事件基本对象的句柄,变量mMutex为互斥量的句柄,

Condition_Initialize( Cond ):
创造三个初叶化就处在触发状态的互斥量并把重临的句柄值赋予mMutex,创设多少个早先化为未触及状态的手动重置事件并把再次来到的句柄值赋予mCondition;

Condition_Destroy( Cond
):通过mCondition和mMutex的句柄值销毁事件基本对象和互斥量;

Condition_Lock( Cond )  == Mutex_Lock( &Cond.mMutex ) ==
WaitForSingleObject( Cond.mMutex, INFINITE )

Condition_Unlock( Cond ) == Mutex_Unlock( &Cond.mMutex ) ==
ReleaseMutex( Cond.mMutex )

Condition_Wait( Cond ):
首先释放互斥量,接着阻塞永久等待事件时有发生,然后等待互斥量;

Condition_TimedWait( Cond ):
首先释放互斥量,接着阻塞在自然的时光内等待事件发生,然后等待互斥量;

Condition_Signal( Cond
):因为是手动重置事件,当其被调用时,全体正在等待该事件的线程都会变成可调度景况;首先须求领会Set伊夫nt和Pulse伊夫nt的差距,因为是手动重置事件,这对于八个函数就有分别了,在机动重置事件类型下事件产生后被等候接受后会自动重置为未接触状态,具体能够查看《Windows宗旨编制程序》第7章的情节,里面还介绍了SignalObjectAndWait函数的法力吧。

Condition条件变量定义的宏在使用进度中协调是不太领悟的,因为调用的时候便于将静观其变事件和取得互斥量互相混淆,明明刚刑释了互斥量然后永久等待事件时有爆发时,好不容易等到事件发生了又要博得互斥量的全数权,所以写者在历次等待和每一遍进入以及随后的淡出Condition时都加了相应的Debug输出,那样或许能够不难精通点,因为时间的涉及,只好将那事放到前边去啃通晓,不过在出口的经过中真的能觉察其起到的成效,比如报告者在无可奉告的景况下等待输出内容的发生。

 

时间戳:

臆度为了与UNIX统一起来,IPerf在Win3二上不是直接调用API使用时间,而是自身包装了gettimeofday,先通过GetSystemTimeAsFileTime获取的UTC格式的岁月转换来UNIX新纪元下的岁月并因而timeval类型进行再次回到,在该兑现函数中使用了多少个新鲜的数字,这在源代码行上的诠释已经说金朝楚,那里不再讲述;

TimeStamp那几个类中就唯有2个连串为timeval的积极分子变量,成员函数包罗获取当前的岁月,对时间举行相加减,比较五个小时的次第等,比较简单精晓。

日子戳要害用在数量传输进度中给各个发送包赋值,申明那几个包发送的年月;还有在-i选项在行使的尺码下,总括每回须要打字与印刷度报纸告的小时,通过比较将要打字与印刷度报纸告的时间和新颖发送包的时刻戳,决定是不是打印那段时间发送的带宽和发送的数据量以及发送的时日段。

 

用作后台服务运营:

仅用于服务端,并且在作为后台服务运作时,-o filename
选项参数才能起到功能,同样也是加盟旁人完毕的文书,稍微看了眨眼之间间,是透过SCManager的API才成立和执行服务的,那一个前边有时光再认真读书,能够设想自个儿在后头的少数类型中得以复用。

 

正文临时就讲到那里,下一篇发轫上课线程和角色,约等于结合着线程讲解客户端、服务端、报告者、监听者的实行进度,临时仅在TCP形式下,UDP后续再来表明,当然知道了TCP情势下的运营逻辑后,相信UDP格局下也简单通晓。