LSP Cn Alpha(Revision 77)

3,898 views
3,777 views

Published on

Linux System Program

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,898
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
235
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

LSP Cn Alpha(Revision 77)

  1. 1. 谨将我们的工作献给 即将毕业离校的兄弟们 — 林晓鑫、刘德超、黄巍、周蓝 珺、胡禹轩、王新喜、何春晓、崔剑、李浩。 以及 潘海东即将出世的小 Baby! – II –
  2. 2. 0 译者序 LSP) 的 文 工作 实 Linux System Prorgramming ( 工业 理 IBM 的 。 工作的同 的 同 。 们 林晓鑫、王 、崔 春、 、何春晓、 、李 、 、 、 、 。 的 文献 SMS@lilacbbs.com 的 王 。刘文 、王 、刘德超、 、王新喜 同 校工作。 的 校 。 工业 文 作 的 工作 李 。 TeX 的 工作 文 进 。 LSP 内 布 原 IBM ( 工程 ) 晓( )的 们 SUN 的业 时间对 进 的校 提出 的 。 们的 的同 。 们示 。 程 的 Harbin Linux User Group 们 示 。 , 程方 的 工作以 的 的 。 存 何 方式 我们 : Website : http://www.footoo.org Twitter : http://twitter.com/cliffwoo Email :cliffwoo@gmail.com 或 cliffwoo@footoo.org Google Groups :http://groups.google.com/group/lspcn/ 工业 2009 4 30 – III –
  3. 3. 0 版权声明 文的 工作 工业 Linux System Programming 的 。文 程的 IBM , 业 。 Linux System Prorgramming 的 作 及原出 文 程的 。 原 作 及出 的出 、 、 作 的 。 – IV –
  4. 4. 目录 译者序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III 版权声明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IV 第 1 章 简介和主要概念. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 1 调 ............................................................ 1.1.1 2 1.1.2 调 调 ....................................................... 3 1.1.3 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.4 C ............................................................ 4 1.2 API ABI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.1 API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.2 ABI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 ..................................................................... 5 SUS 的 1.3.1 POSIX ............................................... 6 1.3.2 C .......................................................... 7 1.3.3 Linux ........................................................ 7 1.3.4 ......................................................... 8 1.4 Linux 程 .......................................................... 8 1.4.1 文件 文件 .................................................... 8 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.2 9 1.4.3 ......................................................... 10 1.4.4 .............................................................. 11 1.4.5 ............................................................ 12 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.6 12 1.4.7 文件 空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.4.8 进程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.9 15 1.4.10 进程 ............................................................ 16 1.4.11 ............................................................ 16 1.4.12 ................................................................. 17 1.4.13 ................................................................. 18 1.4.14 进程间 ......................................................... 18 1.4.15 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 处理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.16 19 程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 22 –V–
  5. 5. 第 2 章 文件 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 24 调 ..................................................... 2.1.1 open() 24 2.1.2 新文件 ....................................................... 26 2.1.3 新文件 ......................................................... 26 2.1.4 creat() .......................................................... 28 2.1.5 .................................................... 29 read() 读 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 29 2.2.1 .............................................................. 30 2.2.2 读 的 .................................................... 31 读. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.3 32 2.2.4 ......................................................... 33 2.2.5 read() 小 ..................................................... 33 write() 写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 34 写 .............................................................. 2.3.1 35 式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2 36 写. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.3 36 2.3.4 ......................................................... 36 2.3.5 write() 小 ..................................................... 37 2.3.6 write() 的 ....................................................... 37 2.4 同步 I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.4.1 fsync() fdatasync() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.4.2 .................................................... 39 2.4.3 sync(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.4.4 O SYNC ....................................................... 41 2.4.5 O DSYNC O RSYNC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.5 I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 42 2.6.1 .............................................................. 43 2.7 lseek() ........................................................... 44 2.7.1 文件 进 ............................................. 45 2.7.2 .............................................................. 46 2.7.3 ................................................................. 46 读写. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8 46 2.8.1 .............................................................. 47 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.9 47 2.10I/O ............................................................. 49 2.10.1 select() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.10.2 .................................................... 52 2.10.3 poll() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 2.10.4 poll() select(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 – VI –
  6. 6. 2.11内 内 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 文件 2.11.1 ....................................................... 62 2.11.2 页 存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 2.11.3 页 写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 2.12 ..................................................................... 65 第 3 章 缓冲输入输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.1 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 小 .............................................................. 3.1.1 67 3.1.2 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.1.3 文件 ............................................................ 68 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 69 式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 69 文件 文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 70 3.3 ................................................................... 71 的 ....................................................... 3.3.1 71 读 3.4 ......................................................... 71 3.4.1 单 读 ......................................................... 71 3.4.2 .................................................. 72 的读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.3 72 3.4.4 读 .................................................... 73 3.4.5 读 进 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 写 3.5 ............................................................ 75 3.5.1 对 的 ......................................................... 75 3.5.2 写 单 ....................................................... 76 3.5.3 写 ......................................................... 76 3.5.4 写 进 .................................................... 77 I/O 示 程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.5 77 3.6 ................................................................... 79 3.6.1 .................................................... 80 3.7 .............................................................. 81 文件 3.8 ......................................................... 82 的文件 3.9 .................................................. 83 3.10 ................................................................. 83 3.11 程 ................................................................. 85 文件 3.11.1 ....................................................... 85 操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11.2 86 I/O 的 3.12对 ....................................................... 87 3.13 ..................................................................... 88 – VII –
  7. 7. 第 4 章 高级文件 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.1 散布 / 聚集 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.1.1 readv() writev() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.2 Event Poll ........................................................... 96 新的 epoll 实 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 96 4.2.2 epoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Epoll 件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 99 件 件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.4 101 4.3 存 映射. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.3.1 mmap() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.3.2 munmap(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 4.3.3 存 映射 子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 4.3.4 mmap() 的 ...................................................... 108 4.3.5 mmap() 的 ...................................................... 109 4.3.6 调 映射的 小 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 映射 的 4.3.7 ............................................... 110 映射 同步文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.8 111 4.3.9 映射提示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 文件 I/O 提示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 114 4.4.1 posix fadvise() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 调 ................................................ 4.4.2 readahead() 116 实 的操作提示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.3 116 4.5 同步 (Synchronized) 同步 (Synchronous) 及异步 ( Asynchronous) 操作 . . 117 4.5.1 异步 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 4.6 I/O 调 I/O 性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 4.6.1 ............................................................ 120 4.6.2 调 的 能....................................................... 121 进读 4.6.3 ......................................................... 122 的 I/O 调 4.6.4 ......................................... 125 I/O 性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.5 125 4.7 ..................................................................... 132 第 5 章 进程管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 5.1 进程 ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 进程 ID. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 134 5.1.2 进程 ............................................................ 134 5.1.3 pid t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 进程 ID 进程的 ID. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.4 135 新进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 136 调 .................................................. 5.2.1 exec 136 调 ...................................................... 5.2.2 fork() 139 – VIII –
  8. 8. 进程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 143 进程的方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 144 5.3.2 atexit(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 5.3.3 on exit( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 5.3.4 SIGCHLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 的子进程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 147 进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.1 150 子进程的方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.2 152 BSD 的 wait3() wait4() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.3 153 新进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.4 155 进程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.5 158 5.5 ................................................................. 158 实 ( )ID、 效 存设 的 5.5.1 ( )ID ( )ID . . . . . . 159 实 存设 的 5.5.2 ( )ID ( )ID . . . . . . . . . . . . . . . . . . . . 160 效 5.5.3 ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 ID 的方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5.4 BSD ID 161 ID 的方式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5.5 HP-UX ID 162 操作 ID 的 方 ...................................... 5.5.6 ID 163 对 存设 的 ID 的 5.5.7 ....................................... 163 5.5.8 ID ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6 164 相的 调 ............................................. 5.6.1 165 进程 相 的 调 ........................................... 5.6.2 167 的进程 5.6.3 .................................................. 168 进程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.7 169 5.8 ..................................................................... 171 第 6 章 高级进程管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 6.1 进程调 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 6.1.1 O ........................................................... 173 6.1.2 时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 进程 Vs. 处理 进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3 I/O 174 调 ............................................................ 6.1.4 175 程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.5 175 出处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 176 理 6.2.1 ............................................................ 176 出处理 方 的 6.2.2 ...................................... 177 6.3 进程 .............................................................. 178 6.3.1 nice() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 6.3.2 getpriority() setpriority(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 6.3.3 I/O .......................................................... 181 – IX –
  9. 9. 6.4 处理 ............................................................ 182 6.4.1 sched getaffinity() sched setaffinity() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 6.5 实时 ................................................................. 185 实时 6.5.1 ....................................................... 186 时 6.5.2 ............................................. 186 6.5.3 Linux 的实时 ................................................... 187 6.5.4 Linux 调 ............................................ 188 6.5.5 设 调 ....................................................... 192 6.5.6 sched rr get interval() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 实时进程的 提 ........................................... 6.5.7 197 性 .............................................................. 6.5.8 197 6.6 ................................................................. 200 6.6.1 ............................................................ 201 设 6.6.2 ............................................... 204 第 7 章 文件与目录管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 7.1 文件及 ......................................................... 207 7.1.1 stat ....................................................... 207 7.1.2 ................................................................. 211 7.1.3 .............................................................. 213 7.1.4 扩展属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 7.2 ..................................................................... 223 工作 7.2.1 ....................................................... 224 7.2.2 ............................................................ 229 7.2.3 ............................................................ 230 7.2.4 读 内 ....................................................... 231 7.3 ..................................................................... 235 7.3.1 .............................................................. 236 7.3.2 ............................................................ 237 7.3.3 ............................................................ 239 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4 240 7.4.1 ................................................................. 240 7.4.2 ................................................................. 241 7.5 设备 ................................................................. 242 设备 7.5.1 ....................................................... 243 7.5.2 ....................................................... 243 7.6 ................................................................. 244 文件 件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7 246 7.7.1 inotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 7.7.2 ................................................................. 247 –X–
  10. 10. 7.7.3 inotify 件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 7.7.4 ....................................................... 252 7.7.5 inotify .................................................... 253 件 小.................................................. 7.7.6 254 inotify 实 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.7.7 255 第 8 章 内存管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.1 进程 空间. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.1.1 页 页 调 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.1.2 存 ......................................................... 257 内存 8.2 ............................................................ 258 8.2.1 ............................................................ 260 8.2.2 调 内存 小 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 内存的 8.2.3 .................................................... 264 8.2.4 对 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 段的 理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 270 存 映射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4 271 存 映射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.1 272 8.4.2 映射 /dev/zero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 存 8.5 ......................................................... 275 malloc usable size() malloc trim() 进 调 . . . . . . . . . . . . . . . . . 8.5.1 277 8.6 调 内存 ............................................................ 278 8.6.1 ....................................................... 278 的 8.7 ............................................................ 280 的 8.7.1 ....................................................... 282 8.7.2 ............................................................ 283 的内存 8.8 .......................................... 284 8.9 存 操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 设 ............................................................ 8.9.1 286 8.9.2 ............................................................ 287 8.9.3 ............................................................ 288 8.9.4 ............................................................ 289 8.9.5 ............................................................ 290 8.10内存 ................................................................. 291 空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.10.1 291 空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.10.2 292 8.10.3 内存 ............................................................ 293 的 8.10.4 ......................................................... 294 页 理内存 8.10.5 ........................................ 294 性存 8.11 .................................................... 295 8.11.1 超 内存 ............................................... 295 – XI –
  11. 11. 第 9 章 信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 9.1 ................................................................. 297 9.1.1 ......................................................... 298 的 9.1.2 Linux ................................................... 298 理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 304 9.2.1 ............................................................ 305 子. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2.2 306 9.2.3 ......................................................... 309 9.2.4 映射 ............................................. 310 9.3 ................................................................. 311 9.3.1 ................................................................. 311 子. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3.2 312 9.3.3 给自 .................................................... 312 9.3.4 给 进程 ............................................. 313 9.4 ..................................................................... 313 的 9.4.1 ............................................... 314 集................................................................... 9.5 316 9.5.1 更 的 集 .................................................. 316 9.6 ................................................................. 317 处理 9.6.1 .................................................... 318 集 ......................................................... 9.6.2 318 理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.7 319 9.7.1 siginfo t ........................................................ 321 9.7.2 si code 的 世 .................................................. 323 的 9.8 .................................................. 325 子. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.8.1 326 9.9 ..................................................................... 326 第 10 章 时间. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 10.1时间的 ......................................................... 330 10.1.1 原 示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 10.1.2 ......................................................... 331 10.1.3 ......................................................... 331 时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1.4 332 进程时间 10.1.5 .................................................. 333 10.2POSIX 时 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 10.3时间 .............................................................. 334 时间. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4 335 更的 10.4.1 .................................................... 336 10.4.2 ....................................................... 337 进程时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4.3 338 – XII –
  12. 12. 时间. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5设 339 时 ......................................................... 10.5.1 340 10.5.2 设 时间的 ........................................... 340 时间. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.6 341 时 ............................................................ 10.7调校 343 10.8 .............................................................. 346 10.8.1 .................................................... 347 10.8.2 Linux 的实时 ................................................... 347 10.8.3 .................................................... 348 10.8.4 实 的 方 ............................................... 350 10.8.5 sleep 的 实 ............................................ 353 10.8.6 超 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 10.8.7 ............................................................ 354 10.9 时 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 10.9.1 单的 ......................................................... 354 10.9.2 间 时 ......................................................... 355 时 ......................................................... 10.9.3 358 10.9.4 设 时 ......................................................... 360 附录 A GCC 对 C 语言的扩展 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 A.1 GNU C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 A.2 内 ................................................................. 365 内 ................................................................. A.3 366 A.4 ................................................................... 367 A.5 ................................................................... 368 的 A.6 ............................................................ 368 内存的 A.7 ......................................................... 368 调 A.8 ............................................... 369 A.9 将 deprecated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 A.10将 used. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 或 A.11将 unused . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 进 (pack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.12将 370 的内存对 A.13 ................................................. 371 存 A.14将 ............................................... 372 A.15 ................................................................. 372 式的 A.16 ....................................................... 373 的内存对 A.17 .................................................. 374 的 A.18 .................................................. 375 A.19 ....................................................... 375 A.20 Case ...................................................... 376 的 操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.21void 377 更 更的 性................................... A.22 377 – XIII –
  13. 13. 附录 B 参考书目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 程 设 的相 B.1 C ............................................. 380 B.2 Linux 程的相 ................................................... 381 B.3 Linux 内 的相 ................................................... 381 B.4 操作 设 的相 ............................................... 382 – XIV –
  14. 14. 1 第 1 章 简介和主要概念 的 程的 将 写 件的相 。 件 的 内 进 。 的 件 、 、调 、 工 shell、文 : 即 GNU Core Utilities, 的 工 集 我 ( GNU 们 的 进程 。 程 内 以 ) C 件。 件( 程 ” ” (high-level)GUI 更 的 们 。 程 的时间 写 件 。 理 程 程 。 作 的 更 的 程 我们 写的 件的 。 的 Linux 上的 程的 。 Linux Linus Torvalds 内 散的 写的 操作 。 Unix Linux Unix 同的 理 自 的原 方方 Linux Unix Linux 的 实 能的 。 的 程的 内 Linux 何 的 Unix 的。然 内 Linux 相 的 Unix 自 出的 的新 的 调 Linux 同的 新 性。 1.1 系统编程 的 的 Unix 程 程。 上 的 上进 工作 Unix X Window 时 我们 的 Unix 以 上 API。 Linux 程 设 的。然 程 的 何 – make 的 上 的 程的 API。 Linux 们 程 程相 们 同 同 。 程 出的 程 对 工作的 的 件 操作 的 然 们 调 上的 。 写的 的 上 上 相 的内 。 的 –1–
  15. 15. 1 程 程 程 (或 相 件 的 。 ), 离 的 程的 然 的 的方 式的 程 同 。 我们 件( web Javascript ( C# 或 程 离 程 PHP Java 更 的 展。然 展 示 程的 。实 上 写 Javascript C# 程。更进 步 Java 程 然 以 程 同 PHP 理 内 的 能 何 写出更 的 。 程的 展 的 Unix Linux 的程 然 程 内 提 的 。 的 C C 程 Apache、 bash、 cp、 Emacs、 init、 gcc、 gdb、 glibc、 ls、 mv、 vim 时的。 X 程的 内 或 设备 的内 。 程的 将 内 。 将 内 上的内 ( 内 对 空间 程。同 程 以及相 的内 展 。设备 程 程 的 。 我 Linux 上 写 程 内 提 我 何 设 小 相 C Linux Linux 提 的 调 们 何工作的 Unix 将 的 。 程 调 的 C C 。 1.1.1 系统调用 程 调 。 调 ( 写 操作 syscalls 或 空间 文 内 ( 的 的 调 。 调 我们 的 read() 的 get thread area() write() set tid address()。 Linux 实 的 调 操作 。 i386 –2–
  16. 16. 1 的 调 相 的 Windows 上 。 300 Linux 的内 ( 实 自的 Alpha i386 PowerPC) 调 。 同 间的 调 存 的 。然 90% 以 上 调 的 上 实 。 上 的 的 内 。 1.1.2 调用系统调用 空间 程 能 内 。 的 空间程 内 的 或 操作内 。相 内 提 空间程 能 内 调 调 。 程 能 内 内 的 。 同的 相同 i386 上 空间程 0x80 的 将 内 int 的 内 处理 的 0x80 的处理 的 调 处理 。 程 存 内 调 。 调 。 上 调 0 i386 5( 空间程 将5 写 存 。 open() int eax 的方式进 处理。 以 i386 存 能的 存 存 。对 ebx、 ecx、 edx、 esi edi 5 的超 的 调 的 存 空间 存 5 的 存 即 。 然 调 的 。 处理 调 的方式 同 的 的。作 程 内 处理 调 的。 内 的 调 的 自 处理。 C 1.1.3 C 库 (libc 程 的 。 的 C Unix C 的 的 提 或 方 的 调 。 的 Linux GNU libc 提 C glibc [gee-lib-see] 或 更 [glib-see]. 提 超 展示的内 。 的C 提 GNU C glibc –3–
  17. 17. 1 调 程 工 。 1.1.4 C 编译器 的C 工 集(gcc 。原 Linux GNU gcc 的 cc 。 示 GNU C Compiler。 GNU C GCC 的 进 。时 的 。然 gcc GNU 调 我 gcc 的时 gcc C 上 文 的 程 。 gcc 实 的 ABI( C ( ”C ”) ”APIs 的 程的 ABIs” ) Unix ( Linux ) 。 1.2 API 和 ABI 将 程 们 们写的程 以 提 的 上。 们 们自 的 Linux 上 的程 能 的 Linux 同时 以 的 更新的 Linux 上。 Linux 性的 相 的 集 程 (API 程 进 (ABI 件 同 间的 。 1.2.1 API 件 间 的 。 提 API 以 的方式) 的方式进 程 段( 的 ( : 以调 程 段( 。 上 示文 的 API 能 对 示文 提 的。 我们 的 实 对 API 的实 。 API API 们 理 的 API 上 。 API 的 件) 给 API 的 API ( 实 提 何实 内 能 的 子 或 或 。 API 的 件 同 的 API 时 。 API 的实 上能 。 API –4–
  18. 18. 1 实 的 子 实 API C C API 的 处理 。 我们 及 的 API IO。 Linux 程 的 API 将 的 。 1.2.2 ABI 的 的 上 或 API ABI 件 间的 进 。 何 自 何 内 以及 进 。 ABI 进 段 能 何 同 ABI 的 上 作 新 。 的 调 、 、 存 、 调 、 ABI 、 进 式。以调 何 调 何 存 以及调 何提 的 。 同的操作 ( i386 上的 Unix 操作 的 ABI 然 效。相 Linux 内的操作 自 的 ABI 相 。 ABI 的 ABI 及 的 的 存 或 。 Linux 自 的 ABI 集 实上 我们以 的 。 ABI alpha x86-64 程 ABI 的 。 ABI 上的 工 (tooltrain 、 。 ABI 的相 内 以 写出更 的 写 或 工 时的绝 ( 实 程。 我们 以 上 Linux 上 的工 内 实 的 ABI 。 1.3 标准 程 的 程 。 Unix Unix 的 。 性 。 Unix 的世 将 方 。 –5–
  19. 19. 1 的 上 们。 Linux Linux 的 POSIX Single Unix Specification(SUS) 内 Unix 操作 上的 C API POSIX SUS 们 效的 的 Unix 程 出 的 API 集。 1.3.1 POSIX 和 SUS 的历史 子工程 (IEEE 的 1980 Unix 的相 工作。自 件 (Free Software Movement 的 ( Richard Stallman POSIX pahz-icks 操作 。 Portable Operating System Interface( 1988 IEEE std 1003.1-1988( 。 1990 POSIX1988 IEEE POSIX IEEE std 1003.1- 。 性的实时 程 1990(POSIX1990 IEEE Std 1003.1b-1993 式 (POSIX 1993 or POSIX.1b) IEEE Std 1003.1c-1995(POSIX 1995 or POSIX.1c) 文。 2001 性 POSIX1990 的 上 单 的 新的 布 IEEE Std 1003.1-2001 (POSIX 2001)。 IEEE Std 1003.1-2004 的 以 2004 新 2004 4 POSIX POSIX.1 。 的 1980 1990 Unix ”Unix ” 处 的将 自 的 Unix 的 ”Unix”。 工业 Unix Open Software Foundation(OSF X/Open -The Open Group。 The Open Group 提 、 。 1990 的时 布 单 Unix The Open Group UNIX (Single UNIX Specification 。相 的 POSIX SUS SUS 的 。 新的 POSIX 。 SUS 的 SUS 布 的 1994 SUSv1 Unix 95. 的 SUS 布 相 的 的 1997 UNIX 98. 新的 SUS,SUSv3 布 的 SUS 2002 Unix 03.SUSv3 。 我将 IEEE Std 1003.1-2001 的 调 提及。我将提及 POSIX POSIX SUS ( 的 超集 SUS POSIX.1 –6–
  20. 20. 1 的 扩展 的 POSIX.1 提 的 能 –APUE S2.2.3 。 1.3.2 C 语言标准 Brian Kernighan 的 作 C程 设 Dennis Ritchie (Prentice Hall) 自 1978 出 式的 C 的 。 的C 的 程的 K&R C。 C Basic 。 对 时 相 的 进 (ANSI 方 的C 1983 进 新的 性 同时 的 。 C++ 程 。 1990 ANSI C 1989 (ISO ANSI C 进 ISO C90。 布 新 ( 然 1995 ISO ISO 的 ISO C99 更新 的内 进 新的 C95。 1999 、新 、 、 C++ 新的 。 inline 1.3.3 Linux 和标准 POSIX 以及 SUS 提 Linux SUSv3 POSIX.1 的 的实时(POSIX.1b) 程 (POSIX.1c) 。更 的 提 的 。 满 Linux POSIX SUS 的 即 SUSv3 实 的 bug。 Linux POSIX.1 POSIX 或 方 ( Linux 的 以我 式 SUS 布 Linux POSIX 或 的。 SUS gcc 提 Linux gcc C ISO C99 的扩展 扩展 相 。 C GNU C。 的 的 子 。 Linux C 的 将 的 。 进 以 的 glibc 。 gcc 扩展 对 新的 gcc 布 gcc 将 的 的C C 程 。 的 Linux 内 调 的 调 Linux 内 的 上实 。 同 的 Linux 布 (LSB 。 Linux ( 自 LSB Linux [Free Standard Group]) –7–

×