Books & Videos

Table of Contents

  1. Chapter 1 History and Standards

    1. 1.1 A Brief History of UNIX and C

    2. 1.2 A Brief History of Linux

    3. 1.3 Standardization

    4. 1.4 Summary

  2. Chapter 2 Fundamental Concepts

    1. 2.1 The Core Operating System: The Kernel

    2. 2.2 The Shell

    3. 2.3 Users and Groups

    4. 2.4 Single Directory Hierarchy, Directories, Links, and Files

    5. 2.5 File I/O Model

    6. 2.6 Programs

    7. 2.7 Processes

    8. 2.8 Memory Mappings

    9. 2.9 Static and Shared Libraries

    10. 2.10 Interprocess Communication and Synchronization

    11. 2.11 Signals

    12. 2.12 Threads

    13. 2.13 Process Groups and Shell Job Control

    14. 2.14 Sessions, Controlling Terminals, and Controlling Processes

    15. 2.15 Pseudoterminals

    16. 2.16 Date and Time

    17. 2.17 Client-Server Architecture

    18. 2.18 Realtime

    19. 2.19 The /proc File System

    20. 2.20 Summary

  3. Chapter 3 System Programming Concepts

    1. 3.1 System Calls

    2. 3.2 Library Functions

    3. 3.3 The Standard C Library; The GNU C Library (glibc)

    4. 3.4 Handling Errors from System Calls and Library Functions

    5. 3.5 Notes on the Example Programs in This Book

    6. 3.6 Portability Issues

    7. 3.7 Summary

    8. 3.8 Exercise

  4. Chapter 4 File I/O: The Universal I/O Model

    1. 4.1 Overview

    2. 4.2 Universality of I/O

    3. 4.3 Opening a File: open()

    4. 4.4 Reading from a File: read()

    5. 4.5 Writing to a File: write()

    6. 4.6 Closing a File: close()

    7. 4.7 Changing the File Offset: lseek()

    8. 4.8 Operations Outside the Universal I/O Model: ioctl()

    9. 4.9 Summary

    10. 4.10 Exercises

  5. Chapter 5 File I/O: Further Details

    1. 5.1 Atomicity and Race Conditions

    2. 5.2 File Control Operations: fcntl()

    3. 5.3 Open File Status Flags

    4. 5.4 Relationship Between File Descriptors and Open Files

    5. 5.5 Duplicating File Descriptors

    6. 5.6 File I/O at a Specified Offset: pread() and pwrite()

    7. 5.7 Scatter-Gather I/O: readv() and writev()

    8. 5.8 Truncating a File: truncate() and ftruncate()

    9. 5.9 Nonblocking I/O

    10. 5.10 I/O on Large Files

    11. 5.11 The /dev/fd Directory

    12. 5.12 Creating Temporary Files

    13. 5.13 Summary

    14. 5.14 Exercises

  6. Chapter 6 Processes

    1. 6.1 Processes and Programs

    2. 6.2 Process ID and Parent Process ID

    3. 6.3 Memory Layout of a Process

    4. 6.4 Virtual Memory Management

    5. 6.5 The Stack and Stack Frames

    6. 6.6 Command-Line Arguments (argc, argv)

    7. 6.7 Environment List

    8. 6.8 Performing a Nonlocal Goto: setjmp() and longjmp()

    9. 6.9 Summary

    10. 6.10 Exercises

  7. Chapter 7 Memory Allocation

    1. 7.1 Allocating Memory on the Heap

    2. 7.2 Allocating Memory on the Stack: alloca()

    3. 7.3 Summary

    4. 7.4 Exercises

  8. Chapter 8 Users and Groups

    1. 8.1 The Password File: /etc/passwd

    2. 8.2 The Shadow Password File: /etc/shadow

    3. 8.3 The Group File: /etc/group

    4. 8.4 Retrieving User and Group Information

    5. 8.5 Password Encryption and User Authentication

    6. 8.6 Summary

    7. 8.7 Exercises

  9. Chapter 9 Process Credentials

    1. 9.1 Real User ID and Real Group ID

    2. 9.2 Effective User ID and Effective Group ID

    3. 9.3 Set-User-ID and Set-Group-ID Programs

    4. 9.4 Saved Set-User-ID and Saved Set-Group-ID

    5. 9.5 File-System User ID and File-System Group ID

    6. 9.6 Supplementary Group IDs

    7. 9.7 Retrieving and Modifying Process Credentials

    8. 9.8 Summary

    9. 9.9 Exercises

  10. Chapter 10 Time

    1. 10.1 Calendar Time

    2. 10.2 Time-Conversion Functions

    3. 10.3 Timezones

    4. 10.4 Locales

    5. 10.5 Updating the System Clock

    6. 10.6 The Software Clock (Jiffies)

    7. 10.7 Process Time

    8. 10.8 Summary

    9. 10.9 Exercise

  11. Chapter 11 System Limits and Options

    1. 11.1 System Limits

    2. 11.2 Retrieving System Limits (and Options) at Run Time

    3. 11.3 Retrieving File-Related Limits (and Options) at Run Time

    4. 11.4 Indeterminate Limits

    5. 11.5 System Options

    6. 11.6 Summary

    7. 11.7 Exercises

  12. Chapter 12 System and Process Information

    1. 12.1 The /proc File System

    2. 12.2 System Identification: uname()

    3. 12.3 Summary

    4. 12.4 Exercises

  13. Chapter 13 File I/O Buffering

    1. 13.1 Kernel Buffering of File I/O: The Buffer Cache

    2. 13.2 Buffering in the stdio Library

    3. 13.3 Controlling Kernel Buffering of File I/O

    4. 13.4 Summary of I/O Buffering

    5. 13.5 Advising the Kernel About I/O Patterns

    6. 13.6 Bypassing the Buffer Cache: Direct I/O

    7. 13.7 Mixing Library Functions and System Calls for File I/O

    8. 13.8 Summary

    9. 13.9 Exercises

  14. Chapter 14 File Systems

    1. 14.1 Device Special Files (Devices)

    2. 14.2 Disks and Partitions

    3. 14.3 File Systems

    4. 14.4 I-nodes

    5. 14.5 The Virtual File System (VFS)

    6. 14.6 Journaling File Systems

    7. 14.7 Single Directory Hierarchy and Mount Points

    8. 14.8 Mounting and Unmounting File Systems

    9. 14.9 Advanced Mount Features

    10. 14.10 A Virtual Memory File System: tmpfs

    11. 14.11 Obtaining Information About a File System: statvfs()

    12. 14.12 Summary

    13. 14.13 Exercise

  15. Chapter 15 File Attributes

    1. 15.1 Retrieving File Information: stat()

    2. 15.2 File Timestamps

    3. 15.3 File Ownership

    4. 15.4 File Permissions

    5. 15.5 I-node Flags (ext2 Extended File Attributes)

    6. 15.6 Summary

    7. 15.7 Exercises

  16. Chapter 16 Extended Attributes

    1. 16.1 Overview

    2. 16.2 Extended Attribute Implementation Details

    3. 16.3 System Calls for Manipulating Extended Attributes

    4. 16.4 Summary

    5. 16.5 Exercise

  17. Chapter 17 Access Control Lists

    1. 17.1 Overview

    2. 17.2 ACL Permission-Checking Algorithm

    3. 17.3 Long and Short Text Forms for ACLs

    4. 17.4 The ACL_MASK Entry and the ACL Group Class

    5. 17.5 The getfacl and setfacl Commands

    6. 17.6 Default ACLs and File Creation

    7. 17.7 ACL Implementation Limits

    8. 17.8 The ACL API

    9. 17.9 Summary

    10. 17.10 Exercise

  18. Chapter 18 Directories and Links

    1. 18.1 Directories and (Hard) Links

    2. 18.2 Symbolic (Soft) Links

    3. 18.3 Creating and Removing (Hard) Links: link() and unlink()

    4. 18.4 Changing the Name of a File: rename()

    5. 18.5 Working with Symbolic Links: symlink() and readlink()

    6. 18.6 Creating and Removing Directories: mkdir() and rmdir()

    7. 18.7 Removing a File or Directory: remove()

    8. 18.8 Reading Directories: opendir() and readdir()

    9. 18.9 File Tree Walking: nftw()

    10. 18.10 The Current Working Directory of a Process

    11. 18.11 Operating Relative to a Directory File Descriptor

    12. 18.12 Changing the Root Directory of a Process: chroot()

    13. 18.13 Resolving a Pathname: realpath()

    14. 18.14 Parsing Pathname Strings: dirname() and basename()

    15. 18.15 Summary

    16. 18.16 Exercises

  19. Chapter 19 Monitoring File Events

    1. 19.1 Overview

    2. 19.2 The inotify API

    3. 19.3 inotify Events

    4. 19.4 Reading inotify Events

    5. 19.5 Queue Limits and /proc Files

    6. 19.6 An Older System for Monitoring File Events: dnotify

    7. 19.7 Summary

    8. 19.8 Exercise

  20. Chapter 20 Signals: Fundamental Concepts

    1. 20.1 Concepts and Overview

    2. 20.2 Signal Types and Default Actions

    3. 20.3 Changing Signal Dispositions: signal()

    4. 20.4 Introduction to Signal Handlers

    5. 20.5 Sending Signals: kill()

    6. 20.6 Checking for the Existence of a Process

    7. 20.7 Other Ways of Sending Signals: raise() and killpg()

    8. 20.8 Displaying Signal Descriptions

    9. 20.9 Signal Sets

    10. 20.10 The Signal Mask (Blocking Signal Delivery)

    11. 20.11 Pending Signals

    12. 20.12 Signals Are Not Queued

    13. 20.13 Changing Signal Dispositions: sigaction()

    14. 20.14 Waiting for a Signal: pause()

    15. 20.15 Summary

    16. 20.16 Exercises

  21. Chapter 21 Signals: Signal Handlers

    1. 21.1 Designing Signal Handlers

    2. 21.2 Other Methods of Terminating a Signal Handler

    3. 21.3 Handling a Signal on an Alternate Stack: sigaltstack()

    4. 21.4 The SA_SIGINFO Flag

    5. 21.5 Interruption and Restarting of System Calls

    6. 21.6 Summary

    7. 21.7 Exercise

  22. Chapter 22 Signals: Advanced Features

    1. 22.1 Core Dump Files

    2. 22.2 Special Cases for Delivery, Disposition, and Handling

    3. 22.3 Interruptible and Uninterruptible Process Sleep States

    4. 22.4 Hardware-Generated Signals

    5. 22.5 Synchronous and Asynchronous Signal Generation

    6. 22.6 Timing and Order of Signal Delivery

    7. 22.7 Implementation and Portability of signal()

    8. 22.8 Realtime Signals

    9. 22.9 Waiting for a Signal Using a Mask: sigsuspend()

    10. 22.10 Synchronously Waiting for a Signal

    11. 22.11 Fetching Signals via a File Descriptor

    12. 22.12 Interprocess Communication with Signals

    13. 22.13 Earlier Signal APIs (System V and BSD)

    14. 22.14 Summary

    15. 22.15 Exercises

  23. Chapter 23 Timers and Sleeping

    1. 23.1 Interval Timers

    2. 23.2 Scheduling and Accuracy of Timers

    3. 23.3 Setting Timeouts on Blocking Operations

    4. 23.4 Suspending Execution for a Fixed Interval (Sleeping)

    5. 23.5 POSIX Clocks

    6. 23.6 POSIX Interval Timers

    7. 23.7 Timers That Notify via File Descriptors: The timerfd API

    8. 23.8 Summary

    9. 23.9 Exercises

  24. Chapter 24 Process Creation

    1. 24.1 Overview of fork(), exit(), wait(), and execve()

    2. 24.2 Creating a New Process: fork()

    3. 24.3 The vfork() System Call

    4. 24.4 Race Conditions After fork()

    5. 24.5 Avoiding Race Conditions by Synchronizing with Signals

    6. 24.6 Summary

    7. 24.7 Exercises

  25. Chapter 25 Process Termination

    1. 25.1 Terminating a Process: _exit() and exit()

    2. 25.2 Details of Process Termination

    3. 25.3 Exit Handlers

    4. 25.4 Interactions Between fork(), stdio Buffers, and _exit()

    5. 25.5 Summary

    6. 25.6 Exercise

  26. Chapter 26 Monitoring Child Processes

    1. 26.1 Waiting on a Child Process

    2. 26.2 Orphans and Zombies

    3. 26.3 The SIGCHLD Signal

    4. 26.4 Summary

    5. 26.5 Exercises

  27. Chapter 27 Program Execution

    1. 27.1 Executing a New Program: execve()

    2. 27.2 The exec() Library Functions

    3. 27.3 Interpreter Scripts

    4. 27.4 File Descriptors and exec()

    5. 27.5 Signals and exec()

    6. 27.6 Executing a Shell Command: system()

    7. 27.7 Implementing system()

    8. 27.8 Summary

    9. 27.9 Exercises

  28. Chapter 28 Process Creation and Program Execution in More Detail

    1. 28.1 Process Accounting

    2. 28.2 The clone() System Call

    3. 28.3 Speed of Process Creation

    4. 28.4 Effect of exec() and fork() on Process Attributes

    5. 28.5 Summary

    6. 28.6 Exercise

  29. Chapter 29 Threads: Introduction

    1. 29.1 Overview

    2. 29.2 Background Details of the Pthreads API

    3. 29.3 Thread Creation

    4. 29.4 Thread Termination

    5. 29.5 Thread IDs

    6. 29.6 Joining with a Terminated Thread

    7. 29.7 Detaching a Thread

    8. 29.8 Thread Attributes

    9. 29.9 Threads Versus Processes

    10. 29.10 Summary

    11. 29.11 Exercises

  30. Chapter 30 Threads: Thread Synchronization

    1. 30.1 Protecting Accesses to Shared Variables: Mutexes

    2. 30.2 Signaling Changes of State: Condition Variables

    3. 30.3 Summary

    4. 30.4 Exercises

  31. Chapter 31 Threads: Thread Safety and Per-Thread Storage

    1. 31.1 Thread Safety (and Reentrancy Revisited)

    2. 31.2 One-Time Initialization

    3. 31.3 Thread-Specific Data

    4. 31.4 Thread-Local Storage

    5. 31.5 Summary

    6. 31.6 Exercises

  32. Chapter 32 Threads: Thread Cancellation

    1. 32.1 Canceling a Thread

    2. 32.2 Cancellation State and Type

    3. 32.3 Cancellation Points

    4. 32.4 Testing for Thread Cancellation

    5. 32.5 Cleanup Handlers

    6. 32.6 Asynchronous Cancelability

    7. 32.7 Summary

  33. Chapter 33 Threads: Further Details

    1. 33.1 Thread Stacks

    2. 33.2 Threads and Signals

    3. 33.3 Threads and Process Control

    4. 33.4 Thread Implementation Models

    5. 33.5 Linux Implementations of POSIX Threads

    6. 33.6 Advanced Features of the Pthreads API

    7. 33.7 Summary

    8. 33.8 Exercises

  34. Chapter 34 Process Groups, Sessions, and Job Control

    1. 34.1 Overview

    2. 34.2 Process Groups

    3. 34.3 Sessions

    4. 34.4 Controlling Terminals and Controlling Processes

    5. 34.5 Foreground and Background Process Groups

    6. 34.6 The SIGHUP Signal

    7. 34.7 Job Control

    8. 34.8 Summary

    9. 34.9 Exercises

  35. Chapter 35 Process Priorities and Scheduling

    1. 35.1 Process Priorities (Nice Values)

    2. 35.2 Overview of Realtime Process Scheduling

    3. 35.3 Realtime Process Scheduling API

    4. 35.4 CPU Affinity

    5. 35.5 Summary

    6. 35.6 Exercises

  36. Chapter 36 Process Resources

    1. 36.1 Process Resource Usage

    2. 36.2 Process Resource Limits

    3. 36.3 Details of Specific Resource Limits

    4. 36.4 Summary

    5. 36.5 Exercises

  37. Chapter 37 Daemons

    1. 37.1 Overview

    2. 37.2 Creating a Daemon

    3. 37.3 Guidelines for Writing Daemons

    4. 37.4 Using SIGHUP to Reinitialize a Daemon

    5. 37.5 Logging Messages and Errors Using syslog

    6. 37.6 Summary

    7. 37.7 Exercise

  38. Chapter 38 Writing Secure Privileged Programs

    1. 38.1 Is a Set-User-ID or Set-Group-ID Program Required?

    2. 38.2 Operate with Least Privilege

    3. 38.3 Be Careful When Executing a Program

    4. 38.4 Avoid Exposing Sensitive Information

    5. 38.5 Confine the Process

    6. 38.6 Beware of Signals and Race Conditions

    7. 38.7 Pitfalls When Performing File Operations and File I/O

    8. 38.8 Don’t Trust Inputs or the Environment

    9. 38.9 Beware of Buffer Overruns

    10. 38.10 Beware of Denial-of-Service Attacks

    11. 38.11 Check Return Statuses and Fail Safely

    12. 38.12 Summary

    13. 38.13 Exercises

  39. Chapter 39 Capabilities

    1. 39.1 Rationale for Capabilities

    2. 39.2 The Linux Capabilities

    3. 39.3 Process and File Capabilities

    4. 39.4 The Modern Capabilities Implementation

    5. 39.5 Transformation of Process Capabilities During exec()

    6. 39.6 Effect on Process Capabilities of Changing User IDs

    7. 39.7 Changing Process Capabilities Programmatically

    8. 39.8 Creating Capabilities-Only Environments

    9. 39.9 Discovering the Capabilities Required by a Program

    10. 39.10 Older Kernels and Systems Without File Capabilities

    11. 39.11 Summary

    12. 39.12 Exercise

  40. Chapter 40 Login Accounting

    1. 40.1 Overview of the utmp and wtmp Files

    2. 40.2 The utmpx API

    3. 40.3 The utmpx Structure

    4. 40.4 Retrieving Information from the utmp and wtmp Files

    5. 40.5 Retrieving the Login Name: getlogin()

    6. 40.6 Updating the utmp and wtmp Files for a Login Session

    7. 40.7 The lastlog File

    8. 40.8 Summary

    9. 40.9 Exercises

  41. Chapter 41 Fundamentals of Shared Libraries

    1. 41.1 Object Libraries

    2. 41.2 Static Libraries

    3. 41.3 Overview of Shared Libraries

    4. 41.4 Creating and Using Shared Libraries—A First Pass

    5. 41.5 Useful Tools for Working with Shared Libraries

    6. 41.6 Shared Library Versions and Naming Conventions

    7. 41.7 Installing Shared Libraries

    8. 41.8 Compatible Versus Incompatible Libraries

    9. 41.9 Upgrading Shared Libraries

    10. 41.10 Specifying Library Search Directories in an Object File

    11. 41.11 Finding Shared Libraries at Run Time

    12. 41.12 Run-Time Symbol Resolution

    13. 41.13 Using a Static Library Instead of a Shared Library

    14. 41.14 Summary

    15. 41.15 Exercise

  42. Chapter 42 Advanced Features of Shared Libraries

    1. 42.1 Dynamically Loaded Libraries

    2. 42.2 Controlling Symbol Visibility

    3. 42.3 Linker Version Scripts

    4. 42.4 Initialization and Finalization Functions

    5. 42.5 Preloading Shared Libraries

    6. 42.6 Monitoring the Dynamic Linker: LD_DEBUG

    7. 42.7 Summary

    8. 42.8 Exercises

  43. Chapter 43 Interprocess Communication Overview

    1. 43.1 A Taxonomy of IPC Facilities

    2. 43.2 Communication Facilities

    3. 43.3 Synchronization Facilities

    4. 43.4 Comparing IPC Facilities

    5. 43.5 Summary

    6. 43.6 Exercises

  44. Chapter 44 Pipes and Fifos

    1. 44.1 Overview

    2. 44.2 Creating and Using Pipes

    3. 44.3 Pipes as a Method of Process Synchronization

    4. 44.4 Using Pipes to Connect Filters

    5. 44.5 Talking to a Shell Command via a Pipe: popen()

    6. 44.6 Pipes and stdio Buffering

    7. 44.7 FIFOs

    8. 44.8 A Client-Server Application Using FIFOs

    9. 44.9 Nonblocking I/O

    10. 44.10 Semantics of read() and write() on Pipes and FIFOs

    11. 44.11 Summary

    12. 44.12 Exercises

  45. Chapter 45 Introduction to System V IPC

    1. 45.1 API Overview

    2. 45.2 IPC Keys

    3. 45.3 Associated Data Structure and Object Permissions

    4. 45.4 IPC Identifiers and Client-Server Applications

    5. 45.5 Algorithm Employed by System V IPC get Calls

    6. 45.6 The ipcs and ipcrm Commands

    7. 45.7 Obtaining a List of All IPC Objects

    8. 45.8 IPC Limits

    9. 45.9 Summary

    10. 45.10 Exercises

  46. Chapter 46 System V Message Queues

    1. 46.1 Creating or Opening a Message Queue

    2. 46.2 Exchanging Messages

    3. 46.3 Message Queue Control Operations

    4. 46.4 Message Queue Associated Data Structure

    5. 46.5 Message Queue Limits

    6. 46.6 Displaying All Message Queues on the System

    7. 46.7 Client-Server Programming with Message Queues

    8. 46.8 A File-Server Application Using Message Queues

    9. 46.9 Disadvantages of System V Message Queues

    10. 46.10 Summary

    11. 46.11 Exercises

  47. Chapter 47 System V Semaphores

    1. 47.1 Overview

    2. 47.2 Creating or Opening a Semaphore Set

    3. 47.3 Semaphore Control Operations

    4. 47.4 Semaphore Associated Data Structure

    5. 47.5 Semaphore Initialization

    6. 47.6 Semaphore Operations

    7. 47.7 Handling of Multiple Blocked Semaphore Operations

    8. 47.8 Semaphore Undo Values

    9. 47.9 Implementing a Binary Semaphores Protocol

    10. 47.10 Semaphore Limits

    11. 47.11 Disadvantages of System V Semaphores

    12. 47.12 Summary

    13. 47.13 Exercises

  48. Chapter 48 System V Shared Memory

    1. 48.1 Overview

    2. 48.2 Creating or Opening a Shared Memory Segment

    3. 48.3 Using Shared Memory

    4. 48.4 Example: Transferring Data via Shared Memory

    5. 48.5 Location of Shared Memory in Virtual Memory

    6. 48.6 Storing Pointers in Shared Memory

    7. 48.7 Shared Memory Control Operations

    8. 48.8 Shared Memory Associated Data Structure

    9. 48.9 Shared Memory Limits

    10. 48.10 Summary

    11. 48.11 Exercises

  49. Chapter 49 Memory Mappings

    1. 49.1 Overview

    2. 49.2 Creating a Mapping: mmap()

    3. 49.3 Unmapping a Mapped Region: munmap()

    4. 49.4 File Mappings

    5. 49.5 Synchronizing a Mapped Region: msync()

    6. 49.6 Additional mmap() Flags

    7. 49.7 Anonymous Mappings

    8. 49.8 Remapping a Mapped Region: mremap()

    9. 49.9 MAP_NORESERVE and Swap Space Overcommitting

    10. 49.10 The MAP_FIXED Flag

    11. 49.11 Nonlinear Mappings: remap_file_pages()

    12. 49.12 Summary

    13. 49.13 Exercises

  50. Chapter 50 Virtual Memory Operations

    1. 50.1 Changing Memory Protection: mprotect()

    2. 50.2 Memory Locking: mlock() and mlockall()

    3. 50.3 Determining Memory Residence: mincore()

    4. 50.4 Advising Future Memory Usage Patterns: madvise()

    5. 50.5 Summary

    6. 50.6 Exercises

  51. Chapter 51 Introduction to Posix IPC

    1. 51.1 API Overview

    2. 51.2 Comparison of System V IPC and POSIX IPC

    3. 51.3 Summary

  52. Chapter 52 Posix Message Queues

    1. 52.1 Overview

    2. 52.2 Opening, Closing, and Unlinking a Message Queue

    3. 52.3 Relationship Between Descriptors and Message Queues

    4. 52.4 Message Queue Attributes

    5. 52.5 Exchanging Messages

    6. 52.6 Message Notification

    7. 52.7 Linux-Specific Features

    8. 52.8 Message Queue Limits

    9. 52.9 Comparison of POSIX and System V Message Queues

    10. 52.10 Summary

    11. 52.11 Exercises

  53. Chapter 53 Posix Semaphores

    1. 53.1 Overview

    2. 53.2 Named Semaphores

    3. 53.3 Semaphore Operations

    4. 53.4 Unnamed Semaphores

    5. 53.5 Comparisons with Other Synchronization Techniques

    6. 53.6 Semaphore Limits

    7. 53.7 Summary

    8. 53.8 Exercises

  54. Chapter 54 Posix Shared Memory

    1. 54.1 Overview

    2. 54.2 Creating Shared Memory Objects

    3. 54.3 Using Shared Memory Objects

    4. 54.4 Removing Shared Memory Objects

    5. 54.5 Comparisons Between Shared Memory APIs

    6. 54.6 Summary

    7. 54.7 Exercise

  55. Chapter 55 File Locking

    1. 55.1 Overview

    2. 55.2 File Locking with flock()

    3. 55.3 Record Locking with fcntl()

    4. 55.4 Mandatory Locking

    5. 55.5 The /proc/locks File

    6. 55.6 Running Just One Instance of a Program

    7. 55.7 Older Locking Techniques

    8. 55.8 Summary

    9. 55.9 Exercises

  56. Chapter 56 Sockets: Introduction

    1. 56.1 Overview

    2. 56.2 Creating a Socket: socket()

    3. 56.3 Binding a Socket to an Address: bind()

    4. 56.4 Generic Socket Address Structures: struct sockaddr

    5. 56.5 Stream Sockets

    6. 56.6 Datagram Sockets

    7. 56.7 Summary

  57. Chapter 57 Sockets: Unix Domain

    1. 57.1 UNIX Domain Socket Addresses: struct sockaddr_un

    2. 57.2 Stream Sockets in the UNIX Domain

    3. 57.3 Datagram Sockets in the UNIX Domain

    4. 57.4 UNIX Domain Socket Permissions

    5. 57.5 Creating a Connected Socket Pair: socketpair()

    6. 57.6 The Linux Abstract Socket Namespace

    7. 57.7 Summary

    8. 57.8 Exercises

  58. Chapter 58 Sockets: Fundamentals of TCP/IP Networks

    1. 58.1 Internets

    2. 58.2 Networking Protocols and Layers

    3. 58.3 The Data-Link Layer

    4. 58.4 The Network Layer: IP

    5. 58.5 IP Addresses

    6. 58.6 The Transport Layer

    7. 58.7 Requests for Comments (RFCs)

    8. 58.8 Summary

  59. Chapter 59 Sockets: Internet Domains

    1. 59.1 Internet Domain Sockets

    2. 59.2 Network Byte Order

    3. 59.3 Data Representation

    4. 59.4 Internet Socket Addresses

    5. 59.5 Overview of Host and Service Conversion Functions

    6. 59.6 The inet_pton() and inet_ntop() Functions

    7. 59.7 Client-Server Example (Datagram Sockets)

    8. 59.8 Domain Name System (DNS)

    9. 59.9 The /etc/services File

    10. 59.10 Protocol-Independent Host and Service Conversion

    11. 59.11 Client-Server Example (Stream Sockets)

    12. 59.12 An Internet Domain Sockets Library

    13. 59.13 Obsolete APIs for Host and Service Conversions

    14. 59.14 UNIX Versus Internet Domain Sockets

    15. 59.15 Further Information

    16. 59.16 Summary

    17. 59.17 Exercises

  60. Chapter 60 Sockets: Server Design

    1. 60.1 Iterative and Concurrent Servers

    2. 60.2 An Iterative UDP echo Server

    3. 60.3 A Concurrent TCP echo Server

    4. 60.4 Other Concurrent Server Designs

    5. 60.5 The inetd (Internet Superserver) Daemon

    6. 60.6 Summary

    7. 60.7 Exercises

  61. Chapter 61 Sockets: Advanced Topics

    1. 61.1 Partial Reads and Writes on Stream Sockets

    2. 61.2 The shutdown() System Call

    3. 61.3 Socket-Specific I/O System Calls: recv() and send()

    4. 61.4 The sendfile() System Call

    5. 61.5 Retrieving Socket Addresses

    6. 61.6 A Closer Look at TCP

    7. 61.7 Monitoring Sockets: netstat

    8. 61.8 Using tcpdump to Monitor TCP Traffic

    9. 61.9 Socket Options

    10. 61.10 The SO_REUSEADDR Socket Option

    11. 61.11 Inheritance of Flags and Options Across accept()

    12. 61.12 TCP Versus UDP

    13. 61.13 Advanced Features

    14. 61.14 Summary

    15. 61.15 Exercises

  62. Chapter 62 Terminals

    1. 62.1 Overview

    2. 62.2 Retrieving and Modifying Terminal Attributes

    3. 62.3 The stty Command

    4. 62.4 Terminal Special Characters

    5. 62.5 Terminal Flags

    6. 62.6 Terminal I/O Modes

    7. 62.7 Terminal Line Speed (Bit Rate)

    8. 62.8 Terminal Line Control

    9. 62.9 Terminal Window Size

    10. 62.10 Terminal Identification

    11. 62.11 Summary

    12. 62.12 Exercises

  63. Chapter 63 Alternative I/O Models

    1. 63.1 Overview

    2. 63.2 I/O Multiplexing

    3. 63.3 Signal-Driven I/O

    4. 63.4 The epoll API

    5. 63.5 Waiting on Signals and File Descriptors

    6. 63.6 Summary

    7. 63.7 Exercises

  64. Chapter 64 Pseudoterminals

    1. 64.1 Overview

    2. 64.2 UNIX 98 Pseudoterminals

    3. 64.3 Opening a Master: ptyMasterOpen()

    4. 64.4 Connecting Processes with a Pseudoterminal: ptyFork()

    5. 64.5 Pseudoterminal I/O

    6. 64.6 Implementing script(1)

    7. 64.7 Terminal Attributes and Window Size

    8. 64.8 BSD Pseudoterminals

    9. 64.9 Summary

    10. 64.10 Exercises

  1. Appendix Tracing System Calls

  2. Appendix Parsing Command-Line Options

    1. Example program

    2. GNU-specific behavior

    3. GNU extensions

  3. Appendix Casting the NULL Pointer

  4. Appendix Kernel Configuration

  5. Appendix Further Sources of Information

    1. Manual pages

    2. GNU info documents

    3. The GNU C library (glibc) manual

    4. Books

    5. Source code of existing applications

    6. The Linux Documentation Project

    7. The GNU project

    8. Newsgroups

    9. Linux kernel mailing list

    10. Web sites

    11. The kernel source code

  6. Appendix Solutions to Selected Exercises

    1. Chapter 5

    2. Chapter 6

    3. Chapter 8

    4. Chapter 9

    5. Chapter 10

    6. Chapter 12

    7. Chapter 13

    8. Chapter 15

    9. Chapter 18

    10. Chapter 20

    11. Chapter 22

    12. Chapter 23

    13. Chapter 24

    14. Chapter 25

    15. Chapter 26

    16. Chapter 27

    17. Chapter 29

    18. Chapter 31

    19. Chapter 33

    20. Chapter 34

    21. Chapter 35

    22. Chapter 36

    23. Chapter 37

    24. Chapter 38

    25. Chapter 44

    26. Chapter 45

    27. Chapter 46

    28. Chapter 47

    29. Chapter 48

    30. Chapter 49

    31. Chapter 50

    32. Chapter 52

    33. Chapter 53

    34. Chapter 55

    35. Chapter 57

    36. Chapter 59

    37. Chapter 60

    38. Chapter 61

    39. Chapter 62

    40. Chapter 63

    41. Chapter 64

  7. Appendix Bibliography

  8. Appendix Updates

  9. Appendix About the Author