If you are an experienced C programmer with a working knowledge of UNIX, you cannot afford to be without this up-to -date tutorial on the system call interface and the most important functions found in the ANSI C library. Richard Stevens describes more than 200 system calls and functions; since he believes the best way to learn code is to read code,a brief example accompanies each description. Building upon information presented in the first 15 chapters, the author offers chapter-long examples teaching you how to create a database library, a PostScript printer driver, a modem dialer, and a program that runs other programs under a pseudo terminal. To make your analysis and understanding ofthis code even easier, and to allow you to modify it, all of the code in the book is available via UUNET. Advanced Programming in the UNIX Environment is applicable to all major UNIX releases, especially System V Release $ and the latest release of 4.3BSD, including 386BSD. These real-world implementations allow you to more clearly understand the status of the current and future standards,including IEEE POSIX and XPG3.
Preface Chapter 1.Introduction 1.1 Introduction 1.2 Logging In 1.3 Files and Directories 1.4 Input and Output 1.5 Programs and Processes 1.6 ANSI C Features 1.7 Error Handling 1.8 User Identification 1.9 Signals 1.10 Unix Time Values 1.11 System Calls and Library Functions 1.12 Summary Chapter 2. Unix Standardization and Implementations 2.1 Introduction 2.2 Unix Standardization 2.3 Unix Implementations 2.4 Relationship of Standards and Implementations 2.5 Limits 2.6 Feature Test Macros 2.7 Primitive System Data Types 2.8 Conflicts Between Standards 2.9 Summary Chapter 3. FiIe I/O 3.1 Introduction 3.2 File Descriptors 3.3 open Function 3.4 creat Function 3.5 close Function 3.6 lseek Function 3.7 read Function 3.8 write Function 3.9 I/O Efficiency 3.10 File Sharing 3.11 Atomic Operations 3.12 dup and dup2 Functions 3.13 fcntl Function 3.14 ioctl Function 3.15 /dev/fd 3.16 Summary Chapter 4. Files and Directories 4.1 Introduction 4.2 stat, fstat, and lstat Functions 4.3 File Types 4.4 Set-User-ID and Set-Group-lD 4.5 File Access Permissions 4.6 Ownership of New Files and Directories 4.7 access Function 4.8 umask Function 4.9 chmod and fchmod Functions 4.10 Sticky Bit 88 4.11 chown, fchown, and lchown Functions 4.12 File Size 4.13 File Truncation 4.14 Fijesystems 4.15 link, unlink, remove, and rename Functions 4.16 Symbolic Links 4.17 symlink and readlink Functions 4.18 File Times 4.19 utime Function 4.20 mkdir and rmdir Functions 4.21 Reading Directories 4.22 chdir, fchdir, and getcwd Functions 4.23 Special Device Files 4.24 sync and fsync Functions 4.25 Summary of File Access Permission Bits 4.26 Summary Chapter 5. Standard I/O Library 5.1 Introduction 5.2 Streams and FILE Objects 5.3 Standard Input, Standard Output, and Standard Error 5.4 Buffering 5.5 Opening a Stream 5.6 Reading and Writing a Stream 5.7 Line-at-a-Time I/O 5.8 Standard I/O Efficiency 5.9 Binary I/O 5.10 Posltioning a Stream 5.11 Formatted I/O 5.12 Implementation Details 5.13 Temporary Files 5.14 Alternatives to Standard I/O 5.15 Summary Chapter 6. System Data Files and Information 6.1 Introduction 6.2 Password File 6.3 Shadow Passwords 6.4 Group File 6.5 Supplementary Group IDs 6.6 Other Data Files 6.7 Login Accounting 6.8 System Identification 6.9 Time and Date Routines 6.10 Summary Chapter 7. The Environment of a Unix Process 7.1 Introduction 7.2 main Function 7.3 Process Termination 7.4 Command-Line Arguments 7.5 Environment List 7.6 Memory Layout of a C Program 7.7 Shared Libraries 7.8 Memory Allocation 7.9 Environment Variables 7.10 set jmp and ionqjmp Functions 7.11 qetrlimit and setrlimit Functions 7.12 Summary Chapter 8. Process Control 8.1 Introduction 8.2 Process Identifiers 8.3 fork Function 8.4 vfork Function 8.5 exit Functions 8.6 wait and waitpid Functions 8.7 wait3 and wait4 Functions 8.8 Race Conditions 8.9 exec Functions 8.10 Changing User IDs and Group IDs 8.11 Interpreter Files 8.12 system Function 8.13 Process Accounting 8.14 User Identification 8.15 Process Times 8.16 Summary Chapter 9. Process Relationships 9.1 Introduction 9.2 Terminal Logins 9.3 Network Logins 9.4 Process Groups 9.5 Sessions 9.6 Controlling Terminal 9.7 tcgetpqrp and tcsetpgrp Functions 9.8 Job Control 9.9 Shell Execution of Programs 9.10 Orphaned Process Groups 9.11 4.3+BSD Implementation 9.12 Summary Chapter 10. Signals 10.1 Introduction 10.2 Signal Concepts 10.3 signal Function 10.4 Unreliable Signals 10.5 Interrupted System Calls 10.6 Reentrant Functions 10.7 SIGCLD Semantics 10.8 Reliable Signal Terminology and Semantics 10.9 kill and ra1se Functions 10.10 alarm and pause Functions 10.11 Signal Sets 10.12 siqprocmask Function 10.13 siqpending Function 10.14 sigaction Function 10.15 sigsetjmp and siglongjmp Functions 10.16 siqsuspend Function 10.17 abort Function 10.18 system Function 10.19 sleep Function 10.20 Job-Control Signals 10.21 Addltional Features 10.22 Summary Chapter 11. Terminal I/O 11.1 Introduction 11.2 Overview 11.3 Special Input Characters 11.4 Getting and Setting Terminal Attributes 11.5 Terminal Option Flags 11.6 stty Command 11.7 Baud Rate Functions 11.8 Line Control Functions 11.9 Terminal Identification 11.10 Canonical Mode 11.11 Noncanonical Mode 11.12 Terminal Window Size 11.13 termcap, terminfo. and curses 11.14 Summary Chapter 12. Advanced I/O 12.1 Introduction 12.2 Nonblocking I/O 12.3 Record Locking 12.4 Streams 12 5 I/O Multiplexing 12.6 Asynchronous I/O 12.7 readv and writev Functions 12.8 readn and writen Functions 12.9 Memory Mapped I/O 12.10 Summary Chapter 13. Daemon Processes 13.1 Introduction 13.2 Daemon Characteristics 13.3 Coding Rules 13.4 Error Loggjng 13.5 Client-Server Model 13.6 Summary Chapter 14. Interprocess Communication 14.1 Introduction 14.2 Pipes 14.3 popen and pciose Functions 14.4 Coprocesses 14.5 FIFOs 14.6 System V IPC 14.7 Message Queues 14.8 Semaphores 14.9 Shared Memory 14.10 Client-Server Properties 14.11 Summary Chapter 15. Advanced Interprocess Communication 15.1 Introduction 15.2 Stream Pipes 15.3 Passing File Descriptors 15.4 An Open Server, Version 1 15.5 Client--Server Connection Functions 15.6 An Open Server, Version 2 15.7 Summary Chapter 16. A Database Library 16.1 Introduction 16.2 History 16.3 The Library 16.4 Implementation Overview 16.5 Centralized or Decentralized? 16.6 Concurrency 16.7 Source Code 16.8 Performance 16.9 Summary Chapter 17. Communicating with a PostScript Printer 17.1 Introduction 17.2 PostScript Communication Dynamics 17.3 Printer Spooling 17.4 Source Code 17.5 Summary Chapter 18. A Modem Dialer 18.1 Introduction 18.2 History 18.3 Program Design 18.4 Data Files 18.5 Server Design 18.6 Server Source Code 18.7 Client Design 18.8 Client Source Code 18.9 Summary Chapter 19. Pseudo Terminals 19.1 Introduction 19.2 Overview 19.3 Opening Pseudo-Terminal Devices 19.4 pty_fork Function 19.5 pty Program 19.6 Using the pty Program 19.7 Advanced Features 19.8 Summary Appendix A. Function Prototypes Appendix B. Miscellaneous Source Code B.1 Our Header File B.2 Standard Error Routines Appendix C. Solutions to Selected Exercises Bibliography Index