Contents
| Foreword | xix |
| Preface | xxi |
| Preface to the First Edition | xxv |
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 29 | |
| 2.2.4 FIPS 33 | |
| 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 35 | |
| 2.3.4 Linux 35 | |
| 2.3.5 Mac OS X 35 | |
| 2.3.6 Solaris 35 | |
| 2.3.7 Other UNIX Systems 36 | |
| 2.4 Relationship of Standards and Implementations 36 | |
| 2.5 Limits 36 | |
| 2.5.1 ISO C Limits 38 | |
| 2.5.2 POSIX Limits 38 | |
| 2.5.3 XSI Limits 40 | |
| 2.5.4 sysconf, pathconf, and fpathconf Functions 41 | |
| 2.5.5 Indeterminate Runtime Limits 48 | |
| 2.6 Options 52 | |
| 2.7 Feature Test Macros 55 | |
| 2.8 Primitive System Data Types 56 | |
| 2.9 Conflicts Between Standards 56 | |
| 2.10 Summary 58 | |
| Chapter 3. File I/O | 59 |
| 3.1 Introduction 59 | |
| 3.2 File Descriptors 59 | |
| 3.3 open Function 60 | |
| 3.4 creat Function 62 | |
| 3.5 close Function 63 | |
| 3.6 lseek Function 63 | |
| 3.7 read Function 67 | |
| 3.8 write Function 68 | |
| 3.9 I/O Efficiency 68 | |
| 3.10 File Sharing 70 | |
| 3.11 Atomic Operations 74 | |
| 3.12 dup and dup2 Functions 76 | |
| 3.13 sync, fsync, and fdatasync Functions 77 | |
| 3.14 fcntl Function 78 | |
| 3.15 ioctl Function 83 | |
| 3.16 /dev/fd 84 | |
| 3.17 Summary 85 | |
| Chapter 4. Files and Directories | 87 |
| 4.1 Introduction 87 | |
| 4.2 stat, fstat, and lstat Functions 87 | |
| 4.3 File Types 88 | |
| 4.4 Set-User-ID and Set-Group-ID 91 | |
| 4.5 File Access Permissions 92 | |
| 4.6 Ownership of New Files and Directories 95 | |
| 4.7 access Function 95 | |
| 4.8 umask Function 97 | |
| 4.9 chmod and fchmod Functions 99 | |
| 4.10 Sticky Bit 101 | |
| 4.11 chown, fchown, and lchown Functions 102 | |
| 4.12 File Size 103 | |
| 4.13 File Truncation 105 | |
| 4.14 File Systems 105 | |
| 4.15 link, unlink, remove, and rename Functions 108 | |
| 4.16 Symbolic Links 112 | |
| 4.17 symlink and readlink Functions 115 | |
| 4.18 File Times 115 | |
| 4.19 utime Function 116 | |
| 4.20 mkdir and rmdir Functions 119 | |
| 4.21 Reading Directories 120 | |
| 4.22 chdir, fchdir, and getcwd Functions 125 | |
| 4.23 Device Special Files 127 | |
| 4.24 Summary of File Access Permission Bits 130 | |
| 4.25 Summary 130 | |
| Chapter 5. Standard I/O Library | 133 |
| 5.1 Introduction 133 | |
| 5.2 Streams and FILE Objects 133 | |
| 5.3 Standard Input, Standard Output, and Standard Error 135 | |
| 5.4 Buffering 135 | |
| 5.5 Opening a Stream 138 | |
| 5.6 Reading and Writing a Stream 140 | |
| 5.7 Line-at-a-Time I/O 142 | |
| 5.8 Standard I/O Efficiency 143 | |
| 5.9 Binary I/O 145 | |
| 5.10 Positioning a Stream 147 | |
| 5.11 Formatted I/O 149 | |
| 5.12 Implementation Details 153 | |
| 5.13 Temporary Files 155 | |
| 5.14 Alternatives to Standard I/O 159 | |
| 5.15 Summary 159 | |
| Chapter 6. System Data Files and Information | 161 |
| 6.1 Introduction 161 |
|
| 6.2 Password File 161 | |
| 6.3 Shadow Passwords 165 | |
| 6.4 Group File 166 | |
| 6.5 Supplementary Group IDs 167 |
|
| 6.6 Implementation Differences 169 | |
| 6.7 Other Data Files 169 | |
| 6.8 Login Accounting 170 | |
| 6.9 System Identification 171 |
|
| 6.10 Time and Date Routines 173 | |
| 6.11 Summary 177 | |
| Chapter 7. Process Environment | 179 |
| 7.1 Introduction 179 | |
| 7.2 main Function 179 | |
| 7.3 Process Termination 180 |
|
| 7.4 Command-Line Arguments 185 |
|
| 7.5 Environment List 185 |
|
| 7.6 Memory Layout of a C Program 186 | |
| 7.7 Shared Libraries 188 |
|
| 7.8 Memory Allocation 189 |
|
| 7.9 Environment Variables 192 | |
| 7.10 setjmp and longjmp Functions 195 | |
| 7.11 getrlimit and setrlimit Functions 202 | |
| 7.12 Summary 206 | |
| Chapter 8. Process Control | 209 |
| 8.1 Introduction 209 |
|
| 8.2 Process Identifiers 209 | |
| 8.3 fork Function 211 | |
| 8.4 vfork Function 216 | |
| 8.5 exit Functions 218 |
|
| 8.6 wait and waitpid Functions 220 | |
| 8.7 waitid Function 226 | |
| 8.8 wait3 and wait4 Functions 227 | |
| 8.9 Race Conditions 227 | |
| 8.10 exec Functions 231 | |
| 8.11 Changing User IDs and Group IDs 237 | |
| 8.12 Interpreter Files 242 | |
| 8.13 system Function 246 | |
| 8.14 Process Accounting 250 | |
| 8.15 User Identification 256 | |
| 8.16 Process Times 257 | |
| 8.17 Summary 259 | |
| Chapter 9. Process Relationships | 261 |
| 9.1 Introduction 261 | |
| 9.2 Terminal Logins 261 | |
| 9.3 Network Logins 266 | |
| 9.4 Process Groups 269 | |
| 9.5 Sessions 270 | |
| 9.6 Controlling Terminal 272 | |
| 9.7 tcgetpgrp, tcsetpgrp, and tcgetsid Functions 273 |
|
| 9.8 Job Control 274 |
|
| 9.9 Shell Execution of Programs 278 |
|
| 9.10 Orphaned Process Groups 282 |
|
| 9.11 FreeBSD Implementation 285 |
|
| 9.12 Summary 287 |
|
| Chapter 10. Signals | 289 |
| 10.1 Introduction 289 | |
| 10.2 Signal Concepts 289 | |
| 10.3 signal Function 298 | |
| 10.4 Unreliable Signals 301 | |
| 10.5 Interrupted System Calls 303 | |
| 10.6 Reentrant Functions 305 |
|
| 10.7 SIGCLD Semantics 308 |
|
| 10.8 Reliable-Signal Terminology and Semantics 310 |
|
| 10.9 kill and raise Functions 311 |
|
| 10.10 alarm and pause Functions 313 |
|
| 10.11 Signal Sets 318 |
|
| 10.12 sigprocmask Function 320 | |
| 10.13 sigpending Function 322 | |
| 10.14 sigaction Function 324 | |
| 10.15 sigsetjmp and siglongjmp Functions 329 | |
| 10.16 sigsuspend Function 333 | |
| 10.17 abort Function 340 |
|
| 10.18 system Function 342 | |
| 10.19 sleep Function 347 | |
| 10.20 Job-Control Signals 349 | |
| 10.21 Additional Features 352 | |
| 10.22 Summary 353 | |
| Chapter 11. Threads | 355 |
| 11.1 Introduction 355 | |
| 11.2 Thread Concepts 355 |
|
| 11.3 Thread Identification 356 |
|
| 11.4 Thread Creation 357 | |
| 11.5 Thread Termination 360 | |
| 11.6 Thread Synchronization 368 | |
| 11.7 Summary 385 |
|
| Chapter 12. Thread Control | 387 |
| 12.1 Introduction 387 | |
| 12.2 Thread Limits 387 | |
| 12.3 Thread Attributes 388 | |
| 12.4 Synchronization Attributes 393 |
|
| 12.5 Reentrancy 401 |
|
| 12.6 Thread-Specific Data 406 | |
| 12.7 Cancel Options 410 | |
| 12.8 Threads and Signals 413 | |
| 12.9 Threads and fork 416 | |
| 12.10 Threads and I/O 420 | |
| 12.11 Summary 420 | |
| Chapter 13. Daemon Processes | 423 |
| 13.1 Introduction 423 |
|
| 13.2 Daemon Characteristics 423 |
|
| 13.3 Coding Rules 425 | |
| 13.4 Error Logging 428 | |
| 13.5 Single-Instance Daemons 432 | |
| 13.6 Daemon Conventions 434 | |
| 13.7 Client-Server Model 439 | |
| 13.8 Summary 439 | |
| Chapter 14. Advanced I/O | 441 |
| 14.1 Introduction 441 | |
| 14.2 Nonblocking I/O 441 |
|
| 14.3 Record Locking 444 |
|
| 14.4 STREAMS 460 |
|
| 14.5 I/O Multiplexing 472 |
|
| 14.5.1 select and pselect Functions 474 | |
| 14.5.2 poll Function 479 | |
| 14.6 Asynchronous I/O 481 | |
| 14.6.1 System V Asynchronous I/O 481 |
|
| 14.6.2 BSD Asynchronous I/O 482 | |
| 14.7 readv and writev Functions 483 |
|
| 14.8 readn and writen Functions 485 | |
| 14.9 Memory-Mapped I/O 487 |
|
| 14.10 Summary 492 | |
| Chapter 15. Interprocess Communication | 495 |
| 15.1 Introduction 495 |
|
| 15.2 Pipes 496 | |
| 15.3 popen and pclose Functions 503 |
|
| 15.4 Coprocesses 510 |
|
| 15.5 FIFOs 514 | |
| 15.6 XSI IPC 518 | |
| 15.6.1 Identifiers and Keys 518 | |
| 15.6.2 Permission Structure 520 | |
| 15.6.3 Configuration Limits 521 | |
| 15.6.4 Advantages and Disadvantages 521 | |
| 15.7 Message Queues 522 | |
| 15.8 Semaphores 527 |
|
| 15.9 Shared Memory 533 | |
| 15.10 Client-Server Properties 541 | |
| 15.11 Summary 543 |
|
| Chapter 16. Network IPC: Sockets | 545 |
| 16.1 Introduction 545 |
|
| 16.2 Socket Descriptors 546 | |
| 16.3 Addressing 549 |
|
| 16.3.1 Byte Ordering 549 | |
| 16.3.2 Address Formats 551 |
|
| 16.3.3 Address Lookup 553 | |
| 16.3.4 Associating Addresses with Sockets 560 | |
| 16.4 Connection Establishment 561 | |
| 16.5 Data Transfer 565 |
|
| 16.6 Socket Options 579 | |
| 16.7 Out-of-Band Data 581 |
|
| 16.8 Nonblocking and Asynchronous I/O 582 |
|
| 16.9 Summary 583 |
|
| Chapter 17. Advanced IPC | 585 |
| 17.1 Introduction 585 | |
| 17.2 STREAMS-Based Pipes 585 | |
| 17.2.1 Naming STREAMS Pipes 589 | |
| 17.2.2 Unique Connections 590 | |
| 17.3 UNIX Domain Sockets 594 | |
| 17.3.1 Naming UNIX Domain Sockets 595 | |
| 17.3.2 Unique Connections 597 |
|
| 17.4 Passing File Descriptors 601 | |
| 17.4.1 Passing File Descriptors over STREAMS-Based Pipes 604 |
|
| 17.4.2 Passing File Descriptors over UNIX Domain Sockets 606 | |
| 17.5 An Open Server, Version 1 615 | |
| 17.6 An Open Server, Version 2 620 | |
| 17.7 Summary 629 | |
| Chapter 18. Terminal I/O | 631 |
| 18.1 Introduction 631 |
|
| 18.2 Overview 631 |
|
| 18.3 Special Input Characters 638 | |
| 18.4 Getting and Setting Terminal Attributes 643 | |
| 18.5 Terminal Option Flags 643 | |
| 18.6 stty Command 651 | |
| 18.7 Baud Rate Functions 652 | |
| 18.8 Line Control Functions 653 | |
| 18.9 Terminal Identification 654 | |
| 18.10 Canonical Mode 660 | |
| 18.11 Noncanonical Mode 663 | |
| 18.12 Terminal Window Size 670 |
|
| 18.13 termcap, terminfo, and curses 672 |
|
| 18.14 Summary 673 | |
| Chapter 19. Pseudo Terminals | 675 |
| 19.1 Introduction 675 | |
| 19.2 Overview 675 | |
| 19.3 Opening Pseudo-Terminal Devices 681 | |
| 19.3.1 STREAMS-Based Pseudo Terminals 683 | |
| 19.3.2 BSD-Based Pseudo Terminals 686 |
|
| 19.3.3 Linux-Based Pseudo Terminals 689 |
|
| 19.4 pty_fork Function 691 | |
| 19.5 pty Program 694 | |
| 19.6 Using the pty Program 698 | |
| 19.7 Advanced Features 705 | |
| 19.8 Summary 706 |
|
| Chapter 20. A Database Library | 709 |
| 20.1 Introduction 709 | |
| 20.2 History 709 | |
| 20.3 The Library 710 | |
| 20.4 Implementation Overview 712 |
|
| 20.5 Centralized or Decentralized? 716 |
|
| 20.6 Concurrency 718 | |
| 20.7 Building the Library 719 |
|
| 20.8 Source Code 719 | |
| 20.9 Performance 747 |
|
| 20.10 Summary 752 |
|
| Chapter 21. Communicating with a Network Printer | 753 |
| 21.1 Introduction 753 | |
| 21.2 The Internet Printing Protocol 753 | |
| 21.3 The Hypertext Transfer Protocol 756 | |
| 21.4 Printer Spooling 757 | |
| 21.5 Source Code 758 | |
| 21.6 Summary 805 | |
| Appendix A. Function Prototypes | 807 |
| Appendix B. Miscellaneous Source Code | 843 |
| B.1 Our Header File 843 | |
| B.2 Standard Error Routines 846 | |
| Appendix C. Solutions to Selected Exercises | 853 |
| Bibliography | 885 |
| Index | 891 |