| 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 |