新書推薦:
《
潜水指南 全彩图解第4版
》
售價:HK$
132.2
《
超大规模集成电路设计——从工具到实例
》
售價:HK$
88.5
《
村上春树·旅(一本充满村上元素的旅行指南,带你寻访电影《挪威的森林》拍摄地,全彩印刷;200余幅摄影作品)
》
售價:HK$
66.1
《
智能驾驶硬件在环仿真测试与实践
》
售價:HK$
155.7
《
都铎王朝时期英格兰海事法庭研究
》
售價:HK$
87.4
《
中年成长:突破人生瓶颈的心理自助方案
》
售價:HK$
65.0
《
维奥莱塔:一个女人的一生
》
售價:HK$
76.2
《
商业银行担保管理实务全指引
》
售價:HK$
144.5
編輯推薦:
读者将通过本书学习如何设计并实现在LinuxTM、SolarisTM、Mac OS X或其他基于POSIX的系统中都可靠的UNIX软件。本书演示如何设计能让UNIX操作系统发挥极致功效的复杂软件。本书对UNIX编程的要点进行了清晰易懂的介绍,内容从如何使用系统调用的小代码段开始,很快过渡到能帮助读者扩展自己技能水平的实际项目。本书对通信、并发和多线程进行了深入探讨,对复杂概念进行了全面且清晰的解释,例如信号和并发,并以此为特色。此外,本书还提供了实例、练习、可重用的代码和用于网络通信应用程序的简化库。本书还是基于新UNIX标准的独立参考书,它完全覆盖了与文件、信号、信号量、POSIX线程和客户机-服务器通信相关的内容。本书的特色还在于增加了关于Web、UDP和服务器性能的新章节。书中相关资料已经经过了大量的课堂测试。主要内容包括:
◎UNIX进程、文件和特殊文件
◎信号和定时器
◎POSIX线程、信号量和IPC
◎TCP、UDP、组播和Web
◎关于因特网电台、服务器性能、定时器、Web缓存和命令解释程序的特色项目
內容簡介:
本书是基于新UNIX标准的完备参考书,对UNIX编程要点进行清晰易懂的介绍,从说明系统调用的短小代码段开始,逐渐过渡到用于技能提升的实际项目。作者深入探讨通信、并发和线程问题,对复杂概念(如信号和并发)进行全面解读,覆盖文件、信号、信号量、POSIX线程和客户机-服务器通信等内容;提供大量实例、练习,以及针对性项目及其参考答案。全书*部分介绍UNIX基础知识,包括文件、进程和特殊文件等;第二部分介绍信号和定时器;第三部分介绍信号量和进程同步;第四部分介绍通信话题。本书适合作为高等院校计算机专业的教材,也可供软件开发人员参考使用。
關於作者:
Kay Robbins 和 Steve Robbins,是美国麻省理工学院博士,现任德州大学圣安东尼奥分校计算机科学系讲师。《UNIX系统编程: 通信、并发与线程》(UNIX Systems Programming: Communication, Concurrency and Threads)是他们的代表作。
译者师蓉,译有《完美Java(第6版)》、《信息架构:大型网站Web设计(第4版)》《像富人一样思考》《故事场景摩天楼》《互联网领导思维》《断点:互联网进化启示录》《游戏编程**指南》《Unity 3.x游戏开发实例》《iPhone应用用户体验设计实战与案例》《社交网站界面设计》等书。
目錄 :
第一部分基础知识
第1章 技术对程序的影响3
1.1?术语的变化3
1.2?时间和速度5
1.3?多道程序设计和分时6
1.4?应用层的并发8
1.4.1?中断8
1.4.2?信号9
1.4.3?输入和输出10
1.4.4?进程、线程和资源共享10
1.4.5?具有共享内存的多个处理器11
1.4.6?网络作为计算机11
1.5?安全和容错12
1.6?非法入侵造成的缓冲区溢出13
1.6.1?缓冲区溢出的后果14
1.6.2?缓冲区溢出和安全16
1.7?UNIX标准17
1.8?延伸阅读19
第2章 程序、线程和进程21
2.1?程序是如何成为进程的21
2.2?线程和执行线程22
2.3?程序映象的布局23
2.4?库函数调用26
2.5?函数返回值和错误29
2.6?参数数组31
2.6.1?用makeargv函数创建一个数组32
2.6.2?makeargv函数的实现34
2.7?线程安全函数38
2.8?静态变量的使用40
2.9?静态对象的结构42
2.10?进程环境48
2.11?进程终止51
2.12?练习:一个env实用程序54
2.13?练习:消息日志55
2.14?延伸阅读57
第3章 UNIX中的进程58
3.1?进程标识符58
3.2?进程状态60
3.3?UNIX 进程创建和fork函数63
3.4?wait函数70
状态值76
3.5?exec函数77
3.6?后台进程和守护进程83
3.7?临界区86
3.8?练习:进程链87
3.9?练习:进程扇88
3.10?延伸阅读89
第4章 UNIX IO90
4.1?设备术语90
4.2?读写91
4.3?打开和关闭文件102
4.4?select函数107
4.5?poll函数116
4.6?文件表示119
4.6.1?文件描述符119
4.6.2?文件指针和缓冲122
4.6.3?文件描述符的继承124
4.7?过滤器和重定向128
4.8?文件控制132
4.9?练习:原子日志135
原子日志库139
4.10?练习:cat实用程序141
4.11?延伸阅读143
第5章 文件和目录144
5.1?UNIX文件系统导航144
5.1.1?当前工作目录145
5.1.2?搜索路径150
5.2?目录访问151
5.2.1?访问文件状态信息153
5.2.2?确定文件的类型156
5.3?UNIX文件系统实现157
5.3.1?UNIX文件实现158
5.3.2?目录实现161
5.4?硬链接和符号链接161
5.4.1?创建或删除一个链接162
5.4.2?创建和删除符号链接167
5.5?练习:which命令172
5.6?练习:邮件通知程序173
5.7?练习:新闻通知程序176
5.8?练习:遍历目录177
5.9?延伸阅读179
第6章 UNIX特殊文件180
6.1?管道180
6.2?流水线184
6.3?FIFO189
6.4?管道与客户机-服务器模型193
6.5?终端控制200
规范和非规范的输入处理208
6.6?音频设备212
6.7?练习:音频218
6.8?练习:屏障220
6.9?练习:stty命令221
6.10?练习:重提客户机-服务器222
6.11?延伸阅读222
第7章 项目:令牌环224
7.1?环形拓扑224
7.2?环的形成226
7.3?环的探讨232
7.4?简单通信234
7.5?用令牌环实现互斥235
7.6?用投票实现互斥237
7.7?匿名环中的领导者选举238
7.8?用于通信的令牌环240
7.9?流水线预处理机242
7.10?并行环算法244
7.10.1?图像过滤244
7.10.2?矩阵乘法247
7.11?弹性环248
7.12?延伸阅读249
第二部分?异步事件
第8章 信号253
8.1?信号的基本概念253
8.2?信号的产生254
8.3?对信号掩码和信号集进行操作259
8.4?捕获和忽略信号sigaction266
8.5?等待信号pause、sigsuspend和sigwait272
8.5.1?pause函数272
8.5.2?sigsuspend函数274
8.5.3?sigwait函数282
8.6?处理信号:错误和异步信号安全283
8.7?用siglongjmp和sigsetjmp进行程序控制286
8.8?使用异步IO编程288
8.9?练习:转储统计300
8.10?练习:同时处理慢速设备301
8.11?延伸阅读301
第9章 时间和定时器303
9.1?POSIX时间303
9.1.1?用从Epoch开始的秒数表示时间304
9.1.2?显示日期和时间305
9.1.3?使用struct timeval表示时间308
9.1.4?使用实时时钟311
9.1.5?耗时和处理器时间的对比313
9.2?睡眠函数316
9.3?POSIX:XSI间隔定时器319
9.4?实时信号323
9.5?POSIX:TMR间隔定时器328
9.6?定时器漂移、溢出和绝对时间333
9.7?延伸阅读344
第10章 项目:虚拟定时器345
10.1?项目概述345
10.2?简单的定时器348
10.3?对5个定时器中的一个进行设置351
10.3.1?virtualtimers对象351
10.3.2?hardwaretimer对象353
10.3.3?主程序实现354
10.3.4?用show谱写定时器代码355
10.4?使用多个定时器361
10.4.1?设置多个定时器364
10.4.2?用多个定时器进行测试365
10.5?多定时器的健壮实现369
10.6?POSIX:TMR定时器的实现371
10.7?一个小型的cron工具mycron372
10.8?延伸阅读372
第11章 项目:破解shell373
11.1?构建一个简单的shell373
11.2?重定向378
11.3?流水线382
11.4?前台的信号处理385
11.5?进程组、会话和控制终端391
11.5.1?进程组391
11.5.2?会话393
11.6?ush中的后台进程396
11.7?作业控制403
11.8?ush的作业控制407
11.8.1?一个作业列表对象407
11.8.2?ush中的作业列表409
11.8.3?ush中的作业控制409
11.8.4?等待流水线时的进程行为410
11.9?延伸阅读411
第三部分?并?发
第12章 POSIX线程415
12.1?监视文件描述符的方法415
12.2?使用线程监视多个文件描述符417
12.3?线程管理420
12.3.1?用ID引用线程421
12.3.2?创建一个线程422
12.3.3?分离和连接423
12.3.4?退出和取消426
12.3.5?向线程传递参数并返回值429
12.4?线程安全438
12.5?用户级线程 VS 内核级线程439
12.6?线程属性442
12.6.1?线程状态443
12.6.2?线程栈444
12.6.3?线程调度446
12.7?练习:并行文件复制450
12.8?延伸阅读451
第13章?线程同步452
13.1?POSIX同步函数452
13.2?互斥锁453
13.2.1?创建并初始化一个互斥量454
13.2.2?销毁一个互斥量455
13.2.3?锁定和解锁互斥量456
13.2.4?保护不安全的库函数458
13.2.5?同步标志和全局值459
13.2.6?让数据结构成为线程安全的465
13.3?最多一次和至少一次的执行467
13.4?条件变量471
13.4.1?条件变量的创建和销毁473
13.4.2?等待并通知条件变量475
13.5?信号处理和线程478
13.5.1?将信号定向到一个特定的线程中479
13.5.2?为线程屏蔽信号480
13.5.3?信号处理的专用线程480
13.6?读者和写者484
13.7?strerror_r实现489
13.8?死锁和其他讨厌的问题491
13.9?练习:多个屏障492
13.10?延伸阅读492
第14章?临界区和信号量493
14.1?临界区的处理493
14.2?信号量496
14.3?POSIX:SEM匿名信号量499
14.4?POSIX:SEM信号量操作501
14.5?POSIX:SEM命名信号量508
14.5.1?创建并打开命名信号量509
14.5.2?关闭信号量并删除其链接512
14.6?练习:许可管理器514
14.6.1?license对象515
14.6.2?runsim主程序515
14.6.3?对许可管理器的扩展516
14.7?延伸阅读516
第15章?POSIX IPC517
15.1?POSIX:XSI进程间通信517
15.1.1?标识并访问IPC对象518
15.1.2?在shell中访问POSIX:XSI IPC资源519
15.2?POSIX:XSI信号量集520
15.2.1?信号量的创建521
15.2.2?信号量的控制523
15.2.3?POSIX信号量集操作525
15.3?POSIX:XSI共享内存532
15.3.1?访问共享内存段532
15.3.2?共享内存段的连接和分离533
15.3.3?控制共享内存534
15.3.4?共享内存示例535
15.4?POSIX:XSI消息队列541
访问消息队列542
15.5?练习:POSIX匿名信号量549
15.6?练习:POSIX命名信号量550
15.7?练习:用共享内存实现管道551
15.8?练习:用消息队列实现管道554
15.9?延伸阅读554
第16章?项目:生产者-消费者同步555
16.1?生产者-消费者问题555
16.2?受互斥锁保护的有界缓冲区557
16.3?使用信号量的缓冲区实现560
16.4?一个简单的生产者-消费者问题简介566
16.5?使用条件变量的有界缓冲区570
16.6?带有完成条件的缓冲区571
16.7?并行文件复制580
16.7.1?并行文件复制的生产者580
16.7.2?并行文件复制的消费者581
16.7.3?并行文件复制的main程序582
16.7.4?并行文件复制的增强582
16.8?线程化打印服务器583
16.8.1?请求缓冲区584
16.8.2?生产者线程585
16.8.3?消费者线程586
16.8.4?打印服务器586
16.8.5?其他增强功能586
16.9?延伸阅读587
第17章?项目:非完全并行虚拟机588
17.1?PVM的历史、术语和结构588
17.2?非完全并行虚拟机591
17.3?NTPVM项目概述593
17.3.1?NEWTASK分组596
17.3.2?DATA分组596
17.3.3?DONE分组597
17.4?调度程序的IO和测试598
17.4.1?用多个窗口测试604
17.4.2?用远程日志测试605
17.5?没有输入的单任务607
17.6?顺序任务608
17.6.1?输入线程609
17.6.2?输出线程610
17.7?并发任务611
17.8?分组通信、广播和屏障611
17.9?终止和信号612
17.10?有序的消息传递613
17.11?延伸阅读613
第四部分?通?信
第18章?面向连接的通信617
18.1?客户机-服务器模型617
18.2?通信信道618
18.3?面向连接的服务器策略622
18.4?通用因特网通信接口(UICI)625
18.4.1?处理错误627
18.4.2?读和写627
18.5?不同服务器策略的UICI实现628
18.6?UICI客户机631
18.7?UICI的套接字实现637
18.7.1?socket函数638
18.7.2?bind函数639
18.7.3?listen1
內容試閱 :
前?言
本书是1995年由Prentice Hall出版的Practical UNIX Programming: A Guide to Communication, Concurrency and Multithreading一书的第2版。为了更好地传达本书的内容,我们将书名修改为UNIX系统编程:通信、并发与线程。与上一版相比,我们不仅改变了书名,还对很多内容进行了修改。
互联网已经成为计算和社会领域的一个主导方面。我们的私人信息联网了;我们的软件经常会受到攻击。因此,编写正确的代码显得尤为重要。在这一版中,我们尝试尽量生成能够正确处理错误和特殊情况的代码。我们意识到,只是声称处理了所有的错误,但在给出的代码中却省略错误处理是没有效果的。不幸的是,错误处理让代码变得更复杂。我们付出了很多努力,以便让代码显得清晰一些。
本书对上一版的另一个重要改进是采用了单一的UNIX规范,我们将其称为POSIX。我们再也不需要决定使用哪个厂商的库函数了现在有了正式的版本。我们已经尽了最大努力来遵循这个标准。
练习和项目让本书变得与众不同。实际上,本书是从作为美国国家科学基金会(National Science Foundation Grant)一部分的项目手册发展而来的。在完成这个项目的初期开发后,我们逐渐认识到:完成这个项目所需的材料分散在不同的地方这些材料通常可以在提供了大量细节、但几乎没有概念陈述的参考书中找到。因此,本书逐渐成为一本基于最新UNIX标准的完整参考书。
本书分为4部分,每部分都包含主题章节和项目章节。主题章节以循序渐进的方式涵盖了指定的内容,并以 试试看和看看会发生什么的形式包含了很多示例和练习。主题章节都以一个或者多个练习小节结束。本书还为进程管理、并发和通信的很多基本概念提供了很多编程练习。这些编程练习与传统科学课程中的实验作用相同。只有通过实践才能真正理解书中的概念。这些练习由易到难,很多练习只需要不到100行代码就能实现。
项目章节通过开发一个规模较大的应用程序来整合几个主题章节的资料。这些项目包含两个层面。除说明编程思想外,这些项目还引导读者理解与应用程序相关的高级主题。这些项目都是分阶段设计的,大多数完整的实现都只需要几百行代码。由于不需要编写大量代码,因此,读者可以将注意力集中在对概念的理解而不是代码调试上。为了简化编程,我们提供了可用于网络通信和输出日志记录的库。对专业的程序员来说,主题章节结尾部分的练习提供了对概念的基本介绍。通常,使用本书的教师可以从中挑选几个练习和一个项目章节让学生在一学期的课程中实现。每个项目都有多种变化,因此,这些项目可以在多个学期里反复使用。
读者可以用不同的方式阅读本书。第一部分的主题章节是阅读本书其他部分的基础。在阅读完第一部分的主题章节后,读者可以按照任何顺序阅读第二部分至第四部分的内容,但后续章节结尾部分关于交互的讨论(例如,线程如何与信号交互)除外。
我们假定读者是优秀的C程序员,但不一定是UNIX C的程序员。读者应该熟悉C语言编程和基本的数据结构。对于刚刚接触UNIX的读者来说,附录A中给出了程序开发的必备知识。
本书包含标准函数的概要。我们在概要的右下角列出了指定函数的相关标准。
本书的内容是有限的。我们欢迎读者提出意见和建议,电子邮件地址为authors@usp.cs.utsa.edu。虽然我们已经尽最大努力保证本书没有错误,但如果你是第一个向我们指出某个错误的人,那么我们会在本书的配套网站上对你表示诚挚的感谢。我们在Web站点http:usp.cs.utsa.eduusp上提供了本书的相关信息。从这个Web站点上可以下载本书中包含的所有代码。