Advanced Programming in the UNIX® Environment, Third Edition


About the Book

Source Code

Errata

Additional Acknowledgements

FAQs

Extra Stuff

Contact the Author

Rich Stevens home page

Buy the book from Addison-Wesley Professional

Contents

Foreword to the Second Edition xix
Preface xxi
Preface to the Second Edition xxv
Preface to the First Edition xxix
Chapter 1.   UNIX System Overview 1
1.1  Introduction         1  
1.2  UNIX Architecture         1  
1.3  Logging In         2  
1.4  Files and Directories         4  
1.5  Input and Output         8  
1.6  Programs and Processes         10  
1.7  Error Handling         14  
1.8  User Identification         16  
1.9  Signals         18  
1.10  Time Values         20  
1.11  System Calls and Library Functions         21  
1.12  Summary         23  
Chapter 2.   UNIX Standardization and Implementations 25
2.1  Introduction         25  
2.2  UNIX Standardization         25  
2.2.1  ISO C         25  
2.2.2  IEEE POSIX         26  
2.2.3  The Single UNIX Specification         30  
2.2.4  FIPS         32  
2.3  UNIX System Implementations         33  
2.3.1  UNIX System V Release 4         33  
2.3.2  4.4BSD         34  
2.3.3  FreeBSD         34  
2.3.4  Linux         35  
2.3.5  Mac OS X         35  
2.3.6  Solaris         35  
2.3.7  Other UNIX Systems         35  
2.4  Relationship of Standards and Implementations         36  
2.5  Limits         36  
2.5.1  ISO C Limits         37  
2.5.2  POSIX Limits         38  
2.5.3  XSI Limits         41  
2.5.4  sysconf, pathconf, and fpathconf Functions         42  
2.5.5  Indeterminate Runtime Limits         49  
2.6  Options         53  
2.7  Feature Test Macros         57  
2.8  Primitive System Data Types         58  
2.9  Differences Between Standards         58  
2.10  Summary         60  
Chapter 3.   File I/O 61
3.1  Introduction         61  
3.2  File Descriptors         61  
3.3  open and openat Functions         62  
3.4  creat Function         66  
3.5  close Function         66  
3.6  lseek Function         66  
3.7  read Function         71  
3.8  write Function         72  
3.9  I/O Efficiency         72  
3.10  File Sharing         74  
3.11  Atomic Operations         77  
3.12  dup and dup2 Functions         79  
3.13  sync, fsync, and fdatasync Functions         81  
3.14  fcntl Function         82  
3.15  ioctl Function         87  
3.16  /dev/fd         88  
3.17  Summary         90  
Chapter 4.   Files and Directories 93
4.1  Introduction         93  
4.2  stat, fstat, fstatat, and lstat Functions         93  
4.3  File Types         95  
4.4  Set-User-ID and Set-Group-ID         98  
4.5  File Access Permissions         99  
4.6  Ownership of New Files and Directories         101  
4.7  access and faccessat Functions         102  
4.8  umask Function         104  
4.9  chmod, fchmod, and fchmodat Functions         106  
4.10  Sticky Bit         108  
4.11  chown, fchown, fchownat, and lchown Functions         109  
4.12  File Size         111  
4.13  File Truncation         112  
4.14  File Systems         113  
4.15  link, linkat, unlink, unlinkat, and remove Functions         116  
4.16  rename and renameat Functions         119  
4.17  Symbolic Links         120  
4.18  Creating and Reading Symbolic Links         123  
4.19  File Times         124  
4.20  futimens, utimensat, and utimes Functions         126  
4.21  mkdir, mkdirat, and rmdir Functions         129  
4.22  Reading Directories         130  
4.23  chdir, fchdir, and getcwd Functions         135  
4.24  Device Special Files         137  
4.25  Summary of File Access Permission Bits         140  
4.26  Summary         140  
Chapter 5.   Standard I/O Library 143
5.1  Introduction         143  
5.2  Streams and FILE Objects         143  
5.3  Standard Input, Standard Output, and Standard Error         145  
5.4  Buffering         145  
5.5  Opening a Stream         148  
5.6  Reading and Writing a Stream         150  
5.7  Line-at-a-Time I/O         152  
5.8  Standard I/O Efficiency         153  
5.9  Binary I/O         156  
5.10  Positioning a Stream         157  
5.11  Formatted I/O         159  
5.12  Implementation Details         164  
5.13  Temporary Files         167  
5.14  Memory Streams         171  
5.15  Alternatives to Standard I/O         174  
5.16  Summary         175  
Chapter 6.   System Data Files and Information 177
6.1  Introduction         177  
6.2  Password File         177  
6.3  Shadow Passwords         181  
6.4  Group File         182  
6.5  Supplementary Group IDs         183  
6.6  Implementation Differences         184  
6.7  Other Data Files         185  
6.8  Login Accounting         186  
6.9  System Identification         187  
6.10  Time and Date Routines         189  
6.11  Summary         196  
Chapter 7.   Process Environment 197
7.1  Introduction         197  
7.2  main Function         197  
7.3  Process Termination         198  
7.4  Command-Line Arguments         203  
7.5  Environment List         203  
7.6  Memory Layout of a C Program         204  
7.7  Shared Libraries         206  
7.8  Memory Allocation         207  
7.9  Environment Variables         210  
7.10  setjmp and longjmp Functions         213  
7.11  getrlimit and setrlimit Functions         220  
7.12  Summary         225  
Chapter 8.   Process Control 227
8.1  Introduction         227  
8.2  Process Identifiers         227  
8.3  fork Function         229  
8.4  vfork Function         234  
8.5  exit Functions         236  
8.6  wait and waitpid Functions         238  
8.7  waitid Function         244  
8.8  wait3 and wait4 Functions         245  
8.9  Race Conditions         245  
8.10  exec Functions         249  
8.11  Changing User IDs and Group IDs         255  
8.12  Interpreter Files         260  
8.13  system Function         264  
8.14  Process Accounting         269  
8.15  User Identification         275  
8.16  Process Scheduling         276  
8.17  Process Times         280  
8.18  Summary         282  
Chapter 9.   Process Relationships 285
9.1  Introduction         285  
9.2  Terminal Logins         285  
9.3  Network Logins         290  
9.4  Process Groups         293  
9.5  Sessions         295  
9.6  Controlling Terminal         296  
9.7  tcgetpgrp, tcsetpgrp, and tcgetsid Functions         298  
9.8  Job Control         299  
9.9  Shell Execution of Programs         303  
9.10  Orphaned Process Groups         307  
9.11  FreeBSD Implementation         310  
9.12  Summary         312  
Chapter 10.   Signals 313
10.1  Introduction         313  
10.2  Signal Concepts         313  
10.3  signal Function         323  
10.4  Unreliable Signals         326  
10.5  Interrupted System Calls         327  
10.6  Reentrant Functions         330  
10.7  SIGCLD Semantics         332  
10.8  Reliable-Signal Terminology and Semantics         335  
10.9  kill and raise Functions         336  
10.10  alarm and pause Functions         338  
10.11  Signal Sets         344  
10.12  sigprocmask Function         346  
10.13  sigpending Function         347  
10.14  sigaction Function         349  
10.15  sigsetjmp and siglongjmp Functions         355  
10.16  sigsuspend Function         359  
10.17  abort Function         365  
10.18  system Function         367  
10.19  sleep, nanosleep, and clock_nanosleep Functions         373  
10.20  sigqueue Function         376  
10.21  Job-Control Signals         377  
10.22  Signal Names and Numbers         379  
10.23  Summary         381  
Chapter 11.   Threads 383
11.1  Introduction         383  
11.2  Thread Concepts         383  
11.3  Thread Identification         384  
11.4  Thread Creation         385  
11.5  Thread Termination         388  
11.6  Thread Synchronization         397  
11.6.1  Mutexes         399  
11.6.2  Deadlock Avoidance         402  
11.6.3  pthread_mutex_timedlock Function         407  
11.6.4  Reader-Writer Locks         409  
11.6.5  Reader-Writer Locking with Timeouts         413  
11.6.6  Condition Variables         413  
11.6.7  Spin Locks         417  
11.6.8  Barriers         418  
11.7  Summary         422  
Chapter 12.   Thread Control 425
12.1  Introduction         425  
12.2  Thread Limits         425  
12.3  Thread Attributes         426  
12.4  Synchronization Attributes         430  
12.4.1  Mutex Attributes         430  
12.4.2  Reader-Writer Lock Attributes         439  
12.4.3  Condition Variable Attributes         440  
12.4.4  Barrier Attributes         441  
12.5  Reentrancy         442  
12.6  Thread-Specific Data         446  
12.7  Cancel Options         451  
12.8  Threads and Signals         453  
12.9  Threads and fork         457  
12.10  Threads and I/O         461  
12.11  Summary         462  
Chapter 13.   Daemon Processes 463
13.1  Introduction         463  
13.2  Daemon Characteristics         463  
13.3  Coding Rules         466  
13.4  Error Logging         469  
13.5  Single-Instance Daemons         473  
13.6  Daemon Conventions         474  
13.7  Client-Server Model         479  
13.8  Summary         480  
Chapter 14.   Advanced I/O 481
14.1  Introduction         481  
14.2  Nonblocking I/O         481  
14.3  Record Locking         485  
14.4  I/O Multiplexing         500  
14.4.1  select and pselect Functions         502  
14.4.2  poll Function         506  
14.5  Asynchronous I/O         509  
14.5.1  System V Asynchronous I/O         510  
14.5.2  BSD Asynchronous I/O         510  
14.5.3  POSIX Asynchronous I/O         511  
14.6  readv and writev Functions         521  
14.7  readn and writen Functions         523  
14.8  Memory-Mapped I/O         525  
14.9  Summary         531  
Chapter 15.   Interprocess Communication 533
15.1  Introduction         533  
15.2  Pipes         534  
15.3  popen and pclose Functions         541  
15.4  Coprocesses         548  
15.5  FIFOs         552  
15.6  XSI IPC         556  
15.6.1  Identifiers and Keys         556  
15.6.2  Permission Structure         558  
15.6.3  Configuration Limits         559  
15.6.4  Advantages and Disadvantages         559  
15.7  Message Queues         561  
15.8  Semaphores         565  
15.9  Shared Memory         571  
15.10  POSIX Semaphores         579  
15.11  Client-Server Properties         585  
15.12  Summary         587  
Chapter 16.   Network IPC: Sockets 589
16.1  Introduction         589  
16.2  Socket Descriptors         590  
16.3  Addressing         593  
16.3.1  Byte Ordering         593  
16.3.2  Address Formats         595  
16.3.3  Address Lookup         597  
16.3.4  Associating Addresses with Sockets         604  
16.4  Connection Establishment         605  
16.5  Data Transfer         610  
16.6  Socket Options         623  
16.7  Out-of-Band Data         626  
16.8  Nonblocking and Asynchronous I/O         627  
16.9  Summary         628  
Chapter 17.   Advanced IPC 629
17.1  Introduction         629  
17.2  UNIX Domain Sockets         629  
17.2.1  Naming UNIX Domain Sockets         634  
17.3  Unique Connections         635  
17.4  Passing File Descriptors         642  
17.5  An Open Server, Version 1         653  
17.6  An Open Server, Version 2         659  
17.7  Summary         669  
Chapter 18.   Terminal I/O 671
18.1  Introduction         671  
18.2  Overview         671  
18.3  Special Input Characters         678  
18.4  Getting and Setting Terminal Attributes         683  
18.5  Terminal Option Flags         683  
18.6  stty Command         691  
18.7  Baud Rate Functions         692  
18.8  Line Control Functions         693  
18.9  Terminal Identification         694  
18.10  Canonical Mode         700  
18.11  Noncanonical Mode         703  
18.12  Terminal Window Size         710  
18.13  termcap, terminfo, and curses         712  
18.14  Summary         713  
Chapter 19.   Pseudo Terminals 715
19.1  Introduction         715  
19.2  Overview         715  
19.3  Opening Pseudo-Terminal Devices         722  
19.4  pty_fork Function         726  
19.5  pty Program         729  
19.6  Using the pty Program         733  
19.7  Advanced Features         740  
19.8  Summary         741  
Chapter 20.   A Database Library 743
20.1  Introduction         743  
20.2  History         743  
20.3  The Library         744  
20.4  Implementation Overview         746  
20.5  Centralized or Decentralized?         750  
20.6  Concurrency         752  
20.7  Building the Library         753  
20.8  Source Code         753  
20.9  Performance         781  
20.10  Summary         786  
Chapter 21.   Communicating with a Network Printer 789
21.1  Introduction         789  
21.2  The Internet Printing Protocol         789  
21.3  The Hypertext Transfer Protocol         792  
21.4  Printer Spooling         793  
21.5  Source Code         795  
21.6  Summary         843  
Appendix A.   Function Prototypes 845
Appendix B.   Miscellaneous Source Code 895
B.1  Our Header File         895  
B.2  Standard Error Routines         898  
Appendix C.   Solutions to Selected Exercises 905
Bibliography 947
Index 955