目录 1
译者序 1
前言 1
第一部分 综述 1
第1章 Solaris系统 1
1.1 引言 1
1.2 登录 2
1.3 shell 2
1.4 文件、目录和文件系统 3
1.5 输入和输出 7
1.6 程序、进程和线程 10
1.7 错误处理 14
1.8 用户标识 15
1.9 信号 16
1.10 UNIX时间值 18
1.11 系统调用和库函数 19
1.12 64位编程概述 21
1.12.1 编写纯64位的程序 22
1.12.2 编译和安装64位的程序 26
1.12.3 大文件的编译环境 27
1.12.4 过渡期的大文件编译环境 28
1.13 小结 29
练习 29
第2章 Solaris简史 31
2.1 引言 31
2.2 初期SunOS 31
2.3 SunOS之后:Solaris 32
2.4 标准 32
2.4.1 ANSI/ISO/IEC C 32
2.4.3 IEEE POSIX 33
2.4.2 System V接口定义 33
2.4.5 单一UNIX规范 34
2.4.4 开放组的XPG4 34
2.5 Solaris 2.5 35
2.6 Solaris 2.6 36
2.7 Solaris 7 36
2.8 Solaris 8 36
2.9 Solaris 9 36
2.10 Solaris标准遵守情况 37
2.11 编译符合标准的应用程序 37
2.12 小结 38
练习 38
3.1 引言 39
3.2.1 测试字符类成员资格 39
3.2 处理字符类 39
第3章 实用工具函数 39
第二部分 基本主题 39
3.2.2 改变字符类成员资格 41
3.2.3 字符类小结 42
3.3 处理字符串 43
3.3.1 得到字符串的长度 44
3.3.2 比较字符串 45
3.3.3 连接字符串 48
3.3.4 复制字符串 50
3.3.5 字符串查找函数 51
3.3.6 生成字符串的副本 56
3.3.7 把一个字符串分割成标记 56
3.3.8 转换字符串的函数 59
3.3.9 把字符串转换成数字 61
3.4.1 比较字节数组 64
3.4 处理字节数组 64
3.3.10 把数字转换成字符串 64
3.4.2 复制字节数组 65
3.4.3 查找字节数组 65
3.4.4 初始化字节数组 66
3.5 动态内存 66
3.5.1 内存对齐 66
3.5.2 分配动态内存 67
3.5.3 释放动态内存 69
3.6 其他内存管理包 70
3.6.1 malloc库 70
3.6.2 bsdmalloc库 71
3.6.3 mapmalloc库 72
3.6.4 watchmalloc共享对象 72
3.6.5 比较malloc库 73
3.7.1 产生临时文件名 75
3.7 临时文件 75
3.7.2 创建临时文件 76
3.8 分析命令行参数 77
3.9 错误报告 82
3.10 挂起进程 84
3.11 小结 84
练习 84
第4章 基本的文件I/O 85
4.1 引言 85
4.2 文件描述符 85
4.3 open函数 85
4.4 creat函数 87
4.5 close和closefrom函数 87
4.6 lseek和llseek函数 88
4.7 tell函数 90
4.9 write和pwrite函数 91
4.8 read和pread函数 91
4.10 readn和writen函数 92
4.11 I/O效率 93
4.12 文件共享 94
4.13 原子的操作 96
4.14 dup和dup2函数 97
4.15 fcntl函数 99
4.16 ioctl函数 107
4.17 fdwalk函数 107
4.18 直接I/O 108
4.19 /dev/fd文件系统 110
4.20 小结 111
练习 111
5.2 文件流、数据类型和常量 112
第5章 标准I/O库 112
5.1 引言 112
5.3 标准输入、标准输出和标准错误输出 113
5.4 打开文件流 113
5.5 关闭文件流 114
5.6 读和写 115
5.6.1 字符输入函数 115
5.6.2 字符输出函数 116
5.6.3 行输入函数 116
5.6.4 行输出函数 117
5.6.5 二进制I/O 117
5.7 流状态 118
5.8 格式化I/O 119
5.8.1 格式输出 119
5.8.2 格式输入 120
5.8.3 格式转换规范 121
5.9 定位流 128
5.8.4 C语言转义序列 128
5.10 文件流锁定 130
5.11 缓冲 134
5.12 标准I/O的效率 136
5.13 小结 140
练习 140
第6章 日期和时间操作 141
6.1 引言 141
6.2 转换时间的复杂性 141
6.3 获得当前时间 142
6.4 设置当前时间 144
6.5 获得当前时区 144
6.6 UNIX时间和日历时间的转换 146
6.6.2 gmtime和gmtime_r函数 147
6.6.1 localtime和localtime_r函数 147
6.6.3 mktime函数 148
6.7 格式日期I/O 149
6.7.1 将日期转换成格式字符串 149
6.7.2 将格式字符串转换成日期 153
6.8 小结 155
练习 155
第7章 用户和组 156
7.1 引言 156
7.2 用户名 156
7.3 用户ID 159
7.4 组ID 162
7.5 组成员资格 164
7.6 口令文件 166
7.7 影像口令文件 170
7.8 读取和加密口令 175
7.9 组文件 180
7.10 utmpx和wtmpx文件 184
7.11 utmp和wtmp文件 189
7.12 lastlog文件 189
7.13 shells文件 191
7.14 小结 192
练习 192
第8章 系统信息和资源限制 193
8.1 引言 193
8.2 系统信息和识别 193
8.3 系统资源限制 198
8.4 每个进程的资源限制 207
8.5 资源控制工具 209
8.6 资源控制示例 215
8.7 资源使用信息 222
8.8 使用/proc文件系统确定资源使用信息 226
8.9 确定系统的平均负荷 233
8.10 小结 234
练习 235
第9章 安全的C编程 236
9.1 引言 236
9.2 缓冲区溢出 236
9.3 程序的环境 237
9.4 防御性编程 238
9.5 最小特权原则 238
9.6 使用chroot“监牢” 240
9.7 编写安全程序的技巧 242
9.8 小结 244
练习 245
10.2.1 dirname函数 247
10.2 路径名组件 247
10.2.2 basename函数 247
第三部分 输入/输出 247
10.1 引言 247
第10章 文件和目录 247
10.3 stat、fstat和lstat函数 249
10.4 文件类型 250
10.5 set-user-ID和set-group-ID 252
10.6 粘着位 253
10.7 文件访问权限 254
10.8 access函数 255
10.9 umask函数 257
10.10 chmod和fchmod函数 258
10.11 chown、fchown和lchown函数 260
10.12 文件尺寸 261
10.14 文件系统 262
10.13 文件截取 262
10.15 link和unlink函数 265
10.16 remove和rename函数 267
10.17 符号链接 268
10.18 解析可能包含符号链接的路径 271
10.18.1 resolvepath函数 271
10.18.2 realpath函数 271
10.19 symlink和readlink函数 272
10.20 文件时间 273
10.21 改变文件的访问时间和修改时间 275
10.21.1 utime函数 275
10.21.2 utimes函数 275
10.22 创建和删除目录 277
10.23 读取目录 277
10.23.1 opendir和fdopendir函数 277
10.23.2 readdir和readdir_r函数 278
10.23.4 closedir函数 279
10.23.3 seekdir、rewinddir和telldir函数 279
10.23.5 ftw和nftw函数 282
10.24 chdir、fchdir和getcwd函数 286
10.25 chroot和fchroot函数 287
10.26 特殊文件 288
10.27 sync和fsync函数 290
10.28 综合讨论 291
10.29 小结 295
练习 296
第11章 使用文件系统 297
11.1 引言 297
11.2 磁盘术语 297
11.3.1 getmntent、getmntany和getextmntent函数 298
11.3 已挂载的文件系统表 298
11.3.2 hasmntopt函数 301
11.3.3 resetmnttab函数 302
11.3.4 putmntent函数 303
11.4 mntfs文件系统ioctl命令 303
11.5 文件系统默认值 305
11.5.1 getvfsent系列函数 305
11.5.2 添加项到/etc/vfstab 308
11.6 挂载和卸载文件系统 308
11.6.1 mount函数 308
11.6.2 umount和umount2函数 312
11.7 获得文件系统的状态 314
11.7.1 statvfs和fstatvfs函数 314
11.7.2 ustat函数 316
11.8 读取文件系统数据结构 317
11.8.1 超级块 318
11.8.2 索引节点表 322
11.8.3 柱面组 325
11.9 小结 330
练习 330
第12章 终端I/O 331
12.1 引言 331
12.2 终端I/O概述 331
12.3 特殊的输入字符 338
12.4 获得和设置终端属性 341
12.5 终端选项标志 343
12.6 波特率函数 347
12.7 行控制函数 348
12.7.1 tcdrain函数 348
12.7.4 tcsendbreak函数 349
12.7.2 tcflow函数 349
12.7.3 tcflush函数 349
12.8 终端标识 350
12.8.1 ctermid和ctermid_r函数 350
12.8.2 isatty函数 350
12.8.3 ttyname和ttyname_r函数 351
12.9 规范模式 354
12.10 非规范模式 356
12.11 终端窗口尺寸 361
12.12 设备无关的终端控制 363
12.13 小结 364
练习 364
第13章 高级I/O 365
13.1 引言 365
13.2 非阻塞I/O 365
13.3 记录锁定 368
13.4 使用fcntl的记录锁定 369
13.5 使用lockf的记录锁定 372
13.6 死锁和活锁 372
13.7 锁继承性和释放 375
13.8 强制锁与建议锁的比较 375
13.9 STREAMS I/O子系统 377
13.10 STREAMS消息 379
13.11 putmsg和putpmsg函数 380
13.12 getmsg和getpmsg函数 381
13.13 STREAMS ioctl操作 384
13.14 使用read和write的STREAMS I/O 386
13.14.1 从STREAMS设备中读取 386
13.14.2 写入到STREAMS设备 386
13.15 I/O多路复用 387
13.16 select函数 388
13.17 poll函数 391
13.18 /dev/poll设备驱动程序 393
13.19 异步I/O 396
13.20 和STREAMS设备文件一起的异步I/O 396
13.21 和其他文件一起的异步I/O 397
13.21.1 aioread和aiowrite函数 397
13.21.2 aiowait函数 398
13.21.3 aiocancel函数 398
13.22 readv和writev函数 398
13.23 sendfile和sendfilev函数 400
13.23.1 sendfile函数 401
13.23.2 sendfilev函数 403
13.24 内存映射的I/O 406
13.25 mmap和munmap函数 406
13.27 madvise函数 412
13.26 mprotect函数 412
13.28 msync函数 413
13.29 在内存中锁定页面 413
13.29.1 mlock和munlock函数 414
13.29.2 mlockall和munlockall函数 414
13.29.3 plock函数 414
13.30 memcntl函数 416
13.31 内存映射I/O的小结 418
13.32 访问控制列表 418
13.33 acl和facl函数 419
13.34 aclfromtext和acltotext函数 420
13.35 aclcheck函数 422
13.36 aclfrommode和acltomode函数 424
13.37 aclsort函数 425
13.38 扩展的文件属性 425
13.39 openat和attropen函数 426
13.40 fstatat函数 428
13.41 unlinkat函数 429
13.42 renameat函数 429
13.43 fchownat函数 430
13.44 futimesat函数 430
13.45 改变扩展属性文件权限 431
13.46 小结 432
练习 432
第四部分 进程和进程控制 433
第14章 UNIX进程的环境 433
14.1 引言 433
14.2 进程启动 433
14.3 进程终止 434
14.3.1 exit和_exit函数 434
14.3.2 atexit函数 435
14.4 命令行参数 437
14.5 环境变量 439
14.5.1 getenv函数 439
14.5.2 putenv函数 439
14.6 C程序的内存布局 441
14.7 共享的对象 442
14.8 内存分配 444
14.8.1 sbrk函数 444
14.8.2 brk函数 444
14.9 setjmp和longjmp函数 444
14.9.1 自动变量、寄存器变量和易变的变量 447
14.9.2 _setjmp和_longjmp函数 449
14.9.3 使用自动变量时的常见错误 449
练习 450
14.11 小结 450
14.10 资源限制 450
第15章 进程控制 451
15.1 引言 451
15.2 进程标识符 451
15.2.1 getpid函数 451
15.2.2 getppid函数 451
15.3 fork和fork1函数 452
15.4 vfork函数 457
15.5 exit和_exit函数 458
15.6 wait函数 459
15.7 waitpid函数 461
15.8 wait3和wait4函数 463
15.9 waitid函数 464
15.10 竞争条件 464
15.11 exec函数 468
15.11.2 execv函数 470
15.11.3 execle函数 470
15.11.1 execl函数 470
15.11.4 execve函数 471
15.11.5 execlp函数 471
15.11.6 execvp函数 472
15.11.7 exec函数的总结 474
15.12 解释程序文件 475
15.13 system函数 479
15.14 进程记账 482
15.15 小结 486
练习 487
16.1 引言 488
16.2 终端登录 488
第16章 进程关系 488
16.3 网络登录 489
16.4 进程组 490
16.5 会话 492
16.6 控制终端 494
16.7 tcgetpgrp和tcsetpgrp函数 495
16.8 tcgetsid函数 495
16.9 作业控制 496
16.10 程序的外壳执行 499
16.11 孤立的进程组 502
16.12 小结 504
练习 505
第17章 信号 506
17.1 引言 506
17.2 信号概念 506
17.3 signal函数 512
17.4 不可靠的信号 515
17.5 可靠的信号 516
17.6 sigset函数 516
17.7 pause函数 518
17.8 sighold、sigrelse、sigignore和sigpause函数 518
17.9 中断的系统调用 519
17.10 可重入函数 520
17.11 比较SIGCHLD和SIGCLD信号 523
17.12 kill、killpg、raise、sigsend和sigsendset函数 525
17.13 alarm函数 527
17.14 间隔计时器 533
17.15 POSIX信号 536
17.16 信号集 537
17.17 sigprocmask函数 537
17.18 sigpending函数 539
17.19 sigaction函数 541
17.20 sigfpe函数 548
17.21 sigsetjmp和siglongjmp函数 551
17.22 sigsuspend函数 554
17.23 sigwait函数 559
17.24 abort函数 561
17.25 重新审视system函数 562
17.26 重新审视sleep函数 568
17.27 作业控制信号 571
17.28 软件信号 573
17.29 备选信号栈 575
17.30 系统信号消息 578
17.31 sig2str和str2sig函数 580
17.32 小结 583
练习 583
18.2 守护程序的特性 584
第18章 守护进程 584
18.1 引言 584
18.3 错误日志 585
18.4 STREAMS log驱动器 585
18.5 syslog工具 589
18.6 成为守护程序 592
18.7 仅启动守护程序的一个副本 596
18.8 小结 598
练习 599
第五部分 进程间通信 601
第19章 使用管道和FIFO的进程间通信 601
19.1 引言 601
19.2 管道 601
19.3 popen和pclose函数 609
19.4 协作进程 617
19.5 FIFO 622
19.6 迭代服务器与并行服务器 630
19.7 小结 631
练习 631
第20章 System V进程间的通信工具 632
20.1 引言 632
20.2 System V IPC的概念 632
20.3 System V消息队列 636
20.4 System V信号量集 649
20.5 System V共享内存 663
20.6 性能比较 673
20.7 小结 678
练习 678
21.1 引言 679
21.2 传递文件描述符 679
第21章 高级进程间通信 679
21.3 开放的服务器(版本1) 682
21.4 客户-服务器连接函数 688
21.5 开放的服务器(版本2) 692
21.6 小结 697
练习 697
第22章 门 698
22.1 引言 698
22.2 基本门函数 699
22.3 门信息函数 711
22.4 门的高级功能 715
22.5 门客户或门服务器的提前终止 724
22.6 小结 730
练习 730
23.1 引言 731
23.2 伪终端概述 731
第23章 伪终端 731
第六部分 伪终端 731
23.3 打开伪终端设备 735
23.4 pty_fork函数 738
23.5 pty程序 740
23.6 使用pty程序 745
23.7 高级特征 751
23.8 小结 758
练习 758
附录 759
附录A 国际化和本地化基本知识 759
附录B BSD源代码兼容性包 767
附录C 函数小结 773
附录D 其他源代码 829
附录E 部分练习题答案 836