本书在介绍UNIX API各种函数的功能和用途的同时,清晰地阐述了它们所隐含的操作系统基本原理。书中给出了大量程序设计示例程序,有助于读者更好地掌握这些函数的功能、使用方法及编程技巧。
封面图
目录
- 前言
- 第1章UNIX导论1
- 1.1UNIX简史1
- 1.1.1UNIX的诞生1
- 1.1.2UNIX的早期发展2
- 1.1.3BSD UNIX3
- 1.1.4系统V UNIX3
- 1.1.5UNIX的商业化4
- 1.1.6Linux4
- 1.2标准5
- 1.2.1SVID5
- 1.2.2POSIX6
- 1.2.3统一UNIX规范6
- 1.2.4C标准8
- 1.3UNIX基本概念8
- 1.3.1程序和进程8
- 1.3.2内核9
- 1.3.3shell10
- 1.3.4用户名与用户ID、用户组与组ID11
- 1.3.5特权用户12
- 1.3.6系统调用与库函数12
- 1.4系统库13
- 1.4.1头文件14
- 1.4.2保留字14
- 1.4.3特征测试宏15
- 1.5示例程序和编译环境16
- 1.6错误处理17
- 1.7系统信息19
- 1.7.1机器标识19
- 1.7.2硬件/软件类型识别19
- 1.8系统能力限制20
- 1.8.1一般能力限制值21
- 1.8.2系统和文件特征选项22
- 1.8.3sysconf()、pathconf()和fpathconf()函数23
- 1.9思考与练习27
- 第2章标准输入输出28
- 2.1UNIX 输入输出基本概念28
- 2.2流和FILE对象30
- 2.3打开和关闭流31
- 2.4读和写流33
- 2.4.1字符I/O33
- 2.4.2行I/O34
- 2.4.3读回退37
- 2.4.4块I/O38
- 2.5文件定位40
- 2.6文件结束和错误指示器42
- 2.7流缓冲43
- 2.8格式I/O46
- 2.8.1格式输出47
- 2.8.2格式输入50
- 2.9临时文件53
- 2.10思考与练习55
- 第3章低级输入输出56
- 3.1文件描述字的打开、创建和关闭56
- 3.2read()和write()函数60
- 3.3设置描述字的文件位置61
- 3.4dup()和dup2()函数64
- 3.5fdopen()和fileno()函数65
- 3.6文件控制函数fcntl()65
- 3.6.1重复文件描述字66
- 3.6.2文件描述字标签67
- 3.6.3文件状态标签68
- 3.7非阻塞I/O71
- 3.8readv()和writev()函数73
- 3.9fsync()和fdatasync()函数74
- 3.10思考与练习75
- 第4章文件与目录77
- 4.1文件77
- 4.1.1stat()、fstat()和lstat()函数78
- 4.2文件类型79
- 4.2.1普通文件79
- 4.2.2目录80
- 4.2.3链接与link()函数80
- 4.2.4符号链接与symlink()和readlink()函数82
- 4.2.5特别文件83
- 4.2.6测试文件的类型84
- 4.3文件的属主和用户组85
- 4.3.1chown()、fchown()和lchown()函数86
- 4.4文件方式87
- 4.4.1文件访问权限88
- 4.4.2调整用户ID和调整组ID89
- 4.4.3 sticky位90
- 4.4.4文件方式位小结91
- 4.5确定和改变文件方式92
- 4.5.1umask()函数92
- 4.5.2chmod()和fchmod()函数94
- 4.5.3access()函数94
- 4.6文件大小96
- 4.6.1截断文件97
- 4.7文件时间99
- 4.7.1utime()和utimes()函数99
- 4.8文件的删除与换名101
- 4.8.1删除文件和目录101
- 4.8.2文件换名103
- 4.9目录操作104
- 4.9.1工作目录104
- 4.9.2创建目录105
- 4.9.3读目录流106
- 4.9.4对目录流的随机访问109
- 4.10思考与练习109
- 第5章进程环境111
- 5.1main()函数111
- 5.2命令行参数111
- 5.2.1命令行参数的语法约定112
- 5.2.2扫描命令行中的选项113
- 5.3环境变量115
- 5.3.1环境表116
- 5.3.2访问环境117
- 5.4终止进程118
- 5.4.1出口状态119
- 5.4.2终止前的清理119
- 5.4.3流产程序120
- 5.5进程的存储空间121
- 5.5.1进程的地址空间122
- 5.5.2动态存储分配与释放123
- 5.5.3释放分配的存储单元126
- 5.6setjmp()和longjmp()函数127
- 5.7进程资源130
- 5.7.1查看与设置资源限制131
- 5.7.2资源使用统计132
- 5.8用户信息133
- 5.8.1用户名133
- 5.8.2用户数据库134
- 5.8.3组数据库136
- 5.9进程的身份凭证139
- 5.10调整进程的身份141
- 5.11思考与练习146
- 第6章进程控制147
- 6.1进程标识147
- 6.2进程创建148
- 6.3执行一个新程序151
- 6.4 等待进程完成155
- 6.5进程终止与僵死进程159
- 6.6system()函数163
- 6.7进程组164
- 6.8会晤期165
- 6.9控制终端166
- 6.10作业控制168
- 6.11思考与练习174
- 第7章信号处理175
- 7.1信号概念175
- 7.2UNIX 信号177
- 7.2.1程序错误类信号179
- 7.2.2程序中止类信号180
- 7.2.3闹钟类信号180
- 7.2.4I/O类信号180
- 7.2.5作业控制类信号181
- 7.2.6操作错误类信号181
- 7.2.7其他信号182
- 7.3生成信号182
- 7.3.1raise()函数182
- 7.3.2kill()函数183
- 7.4设置信号的动作184
- 7.4.1signal()函数184
- 7.4.2进程初启时的信号动作186
- 7.4.3不可靠信号187
- 7.4.4sigaction()函数188
- 7.5信号句柄191
- 7.5.1正常返回的信号句柄192
- 7.5.2终止进程的句柄192
- 7.6阻塞信号193
- 7.6.1sigset_t类型和信号集操作193
- 7.6.2设置信号屏蔽194
- 7.6.3检查悬挂信号196
- 7.7等待信号197
- 7.7.1pause()函数197
- 7.7.2sigsuspend()函数198
- 7.8使用分开的信号栈201
- 7.9信号句柄编程技巧204
- 7.9.1句柄内非局部控制转移204
- 7.9.2可重入函数与异步信号安全函数207
- 7.9.3被信号中断的系统调用210
- 7.9.4原子数据211
- 7.10实时信号212
- 7.10.1SA_SIGINFO标志213
- 7.10.2发送实时信号217
- 7.10.3等待实时信号219
- 7.11思考与练习221
- 第8章时间与定时222
- 8.1系统时钟222
- 8.1.1time()函数222
- 8.1.2gettimeofday()函数223
- 8.2时间格式转换224
- 8.2.1分解的日历时间224
- 8.2.2格式化日期与时间227
- 8.3CPU时间与墙钟时间229
- 8.3.1clock()函数230
- 8.3.2times()函数231
- 8.4睡眠与定时233
- 8.4.1sleep()函数233
- 8.4.2设置定时器233
- 8.5实时时钟与定时237
- 8.5.1实时时钟238
- 8.5.2实时睡眠240
- 8.5.3实时定时器241
- 8.5.4创建和删除实时定时器241
- 8.5.5设置实时定时器243
- 8.5.6定时器超期计数244
- 8.6思考与练习246
- 第9章终端I/O247
- 9.1需要改变终端设置的例子247
- 9.2终端I/O概述249
- 9.2.1终端249
- 9.2.2串行端口250
- 9.2.3终端设备文件252
- 9.2.4输入输出队列252
- 9.2.5加工和非加工输入方式253
- 9.3GTI控制接口254
- 9.3.1termios数据结构254
- 9.3.2GTI控制函数255
- 9.4终端属性256
- 9.4.1输入方式256
- 9.4.2输出方式257
- 9.4.3控制方式258
- 9.4.4局部方式259
- 9.4.5特殊字符260
- 9.4.6stty命令263
- 9.5终端标识263
- 9.6改变终端属性265
- 9.7加工方式与非加工方式输入266
- 9.7.1加工方式输入266
- 9.7.2非加工方式输入267
- 9.8设置波特率272
- 9.9行控制函数273
- 9.10串行端口程序设计275
- 9.11思考与练习278
- 第10章高级I/O279
- 10.1文件锁279
- 10.1.1fcntl()文件锁操作280
- 10.1.2锁的测试、请求和释放282
- 10.1.3文件锁与进程和文件的关系286
- 10.1.4死锁287
- 10.1.5建议锁与强制锁288
- 10.2信号驱动的I/O 289
- 10.3多路转接I/O291
- 10.3.1select()函数291
- 10.3.2poll()函数294
- 10.4异步I/O296
- 10.4.1异步I/O控制块297
- 10.4.2I/O完成时的信号交付298
- 10.4.3异步I/O的优先级299
- 10.4.4异步I/O函数299
- 10.4.5异步I/O之例304
- 10.4.6异步I/O注意事项307
- 10.5存储映射I/O308
- 10.6思考与练习314
- 第11章进程间通信316
- 11.1管道316
- 11.1.1创建管道317
- 11.1.2父子进程间的管道通信317
- 11.1.3连接标准输入和标准输出的管道319
- 11.1.4popen()和pclose()函数321
- 11.1.5管道I/O的原子性322
- 11.2FIFO特别文件323
- 11.2.1创建FIFO323
- 11.2.2FIFO操作325
- 11.2.3FIFO用于客户/服务通信328
- 11.3系统V IPC331
- 11.3.1关键字和标识332
- 11.3.2IPC资源描述结构与成员ipc_perm333
- 11.3.3ipcs和ipcrm命令334
- 11.4消息队列334
- 11.4.1创建和获得消息队列336
- 11.4.2消息队列的查询、设置和删除337
- 11.4.3发送和接收消息339
- 11.5共享存储段343
- 11.5.1创建和获得共享存储段343
- 11.5.2共享存储段的查询、设置和删除344
- 11.5.3共享存储段的连接和分离345
- 11.6信号量347
- 11.6.1创建和获得信号量标识348
- 11.6.2信号量的查询、设置和删除350
- 11.6.3信号量操作352
- 11.7思考与练习357
- 第12章套接字与网络通信358
- 12.1TCP/IP协议358
- 12.2套接字360
- 12.3套接字地址结构364
- 12.3.1IP地址364
- 12.3.2域名地址366
- 12.3.3服务与端口号369
- 12.3.4套接字地址数据结构371
- 12.3.5字节顺序373
- 12.4命名套接字374
- 12.5套接字通信模式377
- 12.6流套接字操作379
- 12.6.1请求连接379
- 12.6.2接收连接381
- 12.6.3getsockname()和getpeername()函数385
- 12.6.4多客户服务386
- 12.6.5send()和recv()函数388
- 12.7套接字选项390
- 12.8带外数据392
- 12.8.1TCP带外数据392
- 12.8.2带外数据的发送和接收393
- 12.8.3带外数据标志397
- 12.9数据报套接字操作399
- 12.9.1sendto()和recvfrom()函数399
- 12.9.2数据报套接字客户/服务之例400
- 12.9.3使用connect()函数403
- 12.10超时处理404
- 12.11思考与练习405
- 第13章线程406
- 13.1线程概念406
- 13.1.1什么是线程406
- 13.1.2线程的好处409
- 13.1.3Pthreads线程412
- 13.1.4线程标识413
- 13.2创建线程414
- 13.3终止线程415
- 13.3.1等待线程终止416
- 13.3.2可汇合与分离的线程418
- 13.4创建特殊属性的线程420
- 13.5互斥变量425
- 13.5.1互斥变量的初始化和销毁427
- 13.5.2互斥变量属性428
- 13.5.3互斥变量的加锁与解锁431
- 13.5.4互斥变量与spin锁433
- 13.6读写锁435
- 13.6.1读写锁的初始化和销毁435
- 13.6.2读写锁的上锁与解锁436
- 13.7条件变量439
- 13.7.1创建和销毁条件变量441
- 13.7.2条件变量属性441
- 13.7.3等待条件变量443
- 13.7.4唤醒条件变量等待445
- 13.8思考与练习448
- 第14章线程高级特征450
- 14.1线程专有数据450
- 14.1.1线程专有数据键的创建和删除451
- 14.1.2使用线程专有数据454
- 14.2取消线程456
- 14.2.1线程的可取消属性457
- 14.2.2取消线程与取消点458
- 14.2.3异步取消的安全性461
- 14.2.4现场清理462
- 14.3 线程调度464
- 14.3.1线程调度竞争范围465
- 14.3.2调度策略与优先级467
- 14.3.3线程调度属性469
- 14.3.4动态改变线程的调度策略和优先级471
- 14.4线程与信号474
- 14.4.1信号动作474
- 14.4.2信号屏蔽475
- 14.4.3 向线程发送信号476
- 14.4.4等待信号477
- 14.4.5一种新的事件通知方法:SIGEV_THREAD480
- 14.5思考与练习483
- 参考文献484