IT training linux system programming talking directly to the kernel and c library

390 112 0
IT training linux system programming talking directly to the kernel and c library

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

LINUX System Programming Other Linux resources from O’Reilly Related titles Linux Books Resource Center Building Embedded Linux Systems Designing Embedded Hardware Linux Device Drivers Linux Kernel in a Nutshell Programming Embedded Systems Running Linux Understanding Linux Network Internals Understanding the Linux Kernel linux.oreilly.com is a complete catalog of O’Reilly’s books on Linux and Unix and related technologies, including sample chapters and code examples ONLamp.com is the premier site for the open source web platform: Linux, Apache, MySQL and either Perl, Python, or PHP Conferences O’Reilly brings diverse innovators together to nurture the ideas that spark revolutionary industries We specialize in documenting the latest tools and systems, translating the innovator’s knowledge into useful skills for those in the trenches Visit conferences.oreilly.com for our upcoming events Safari Bookshelf (safari.oreilly.com) is the premier online reference library for programmers and IT professionals Conduct searches across more than 1,000 books Subscribers can zero in on answers to time-critical questions in a matter of seconds Read the books on your Bookshelf from cover to cover or simply flip to the page you need Try it today for free LINUX System Programming Robert Love Beijing • Cambridge • Farnham • Köln • Paris • Sebastopol • Taipei • Tokyo Linux System Programming by Robert Love Copyright © 2007 O’Reilly Media, Inc All rights reserved Printed in the United States of America Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472 O’Reilly books may be purchased for educational, business, or sales promotional use Online editions are also available for most titles (safari.oreilly.com) For more information, contact our corporate/institutional sales department: (800) 998-9938 or corporate@oreilly.com Editor: Andy Oram Production Editor: Sumita Mukherji Copyeditor: Rachel Head Proofreader: Sumita Mukherji Indexer: John Bickelhaupt Cover Designer: Karen Montgomery Interior Designer: David Futato Illustrator: Jessamyn Read Printing History: September 2007: First Edition Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of O’Reilly Media, Inc The Linux series designations, Linux System Programming, images of the man in the flying machine, and related trade dress are trademarks of O’Reilly Media, Inc Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks Where those designations appear in this book, and O’Reilly Media, Inc was aware of a trademark claim, the designations have been printed in caps or initial caps While every precaution has been taken in the preparation of this book, the publisher and author assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein This book uses RepKover™, a durable and flexible lay-flat binding ISBN-10: 0-596-00958-5 ISBN-13: 978-0-596-00958-8 [M] Table of Contents Foreword ix Preface xi Introduction and Essential Concepts System Programming APIs and ABIs Standards Concepts of Linux Programming Getting Started with System Programming 22 File I/O 23 Opening Files Reading via read( ) Writing with write( ) Synchronized I/O Direct I/O Closing Files Seeking with lseek( ) Positional Reads and Writes Truncating Files Multiplexed I/O Kernel Internals Conclusion 24 29 33 37 40 41 42 44 45 47 57 61 v Buffered I/O 62 User-Buffered I/O Standard I/O Opening Files Opening a Stream via File Descriptor Closing Streams Reading from a Stream Writing to a Stream Sample Program Using Buffered I/O Seeking a Stream Flushing a Stream Errors and End-of-File Obtaining the Associated File Descriptor Controlling the Buffering Thread Safety Critiques of Standard I/O Conclusion 62 64 65 66 67 67 70 72 74 75 76 77 77 79 81 82 Advanced File I/O 83 Scatter/Gather I/O The Event Poll Interface Mapping Files into Memory Advice for Normal File I/O Synchronized, Synchronous, and Asynchronous Operations I/O Schedulers and I/O Performance Conclusion 84 89 95 108 111 114 125 Process Management 126 The Process ID Running a New Process Terminating a Process Waiting for Terminated Child Processes Users and Groups Sessions and Process Groups Daemons Conclusion vi | Table of Contents 126 129 136 139 149 154 159 161 Advanced Process Management 162 Process Scheduling Yielding the Processor Process Priorities Processor Affinity Real-Time Systems Resource Limits 162 166 169 172 176 190 File and Directory Management 196 Files and Their Metadata Directories Links Copying and Moving Files Device Nodes Out-of-Band Communication Monitoring File Events 196 212 223 228 231 233 234 Memory Management 243 The Process Address Space Allocating Dynamic Memory Managing the Data Segment Anonymous Memory Mappings Advanced Memory Allocation Debugging Memory Allocations Stack-Based Allocations Choosing a Memory Allocation Mechanism Manipulating Memory Locking Memory Opportunistic Allocation 243 245 255 256 260 263 264 268 269 273 277 Signals 279 Signal Concepts Basic Signal Management Sending a Signal Reentrancy Signal Sets Blocking Signals 280 286 291 293 295 296 Table of Contents | vii Advanced Signal Management Sending a Signal with a Payload Conclusion 298 305 306 10 Time 308 Time’s Data Structures POSIX Clocks Getting the Current Time of Day Setting the Current Time of Day Playing with Time Tuning the System Clock Sleeping and Waiting Timers 310 313 315 318 320 321 324 330 Appendix GCC Extensions to the C Language 339 Bibliography 351 Index 355 viii | Table of Contents Foreword There is an old line that Linux kernel developers like to throw out when they are feeling grumpy: “User space is just a test load for the kernel.” By muttering this line, the kernel developers aim to wash their hands of all responsibility for any failure to run user-space code as well as possible As far as they’re concerned, user-space developers should just go away and fix their own code, as any problems are definitely not the kernel’s fault To prove that it usually is not the kernel that is at fault, one leading Linux kernel developer has been giving a “Why User Space Sucks” talk to packed conference rooms for more than three years now, pointing out real examples of horrible userspace code that everyone relies on every day Other kernel developers have created tools that show how badly user-space programs are abusing the hardware and draining the batteries of unsuspecting laptops But while user-space code might be just a “test load” for kernel developers to scoff at, it turns out that all of these kernel developers also depend on that user-space code every day If it weren’t present, all the kernel would be good for would be to print out alternating ABABAB patterns on the screen Right now, Linux is the most flexible and powerful operating system that has ever been created, running everything from the tiniest cell phones and embedded devices to more than 70 percent of the world’s top 500 supercomputers No other operating system has ever been able to scale so well and meet the challenges of all of these different hardware types and environments And along with the kernel, code running in user space on Linux can also operate on all of those platforms, providing the world with real applications and utilities people rely on In this book, Robert Love has taken on the unenviable task of teaching the reader about almost every system call on a Linux system In so doing, he has produced a tome that will allow you to fully understand how the Linux kernel works from a user-space perspective, and also how to harness the power of this system ix ... facilities The C Compiler In Linux, the standard C compiler is provided by the GNU Compiler Collection (gcc) Originally, gcc was GNU’s version of cc, the C Compiler Thus, gcc stood for GNU C Compiler... how the kernel handles system call invocation That knowledge is encoded into the standard calling conventions for the architecture, and handled automatically by the compiler and the C library System. .. application can then trap into the kernel through this well-defined mechanism, and execute only code that the kernel allows it to execute The exact mechanism varies from architecture to architecture

Ngày đăng: 05/11/2019, 14:59

Từ khóa liên quan

Mục lục

  • Linux System Programming

    • Table of Contents

    • Foreword

    • Preface

      • Audience and Assumptions

      • Contents of This Book

      • Versions Covered in This Book

      • Conventions Used in This Book

      • Safari® Books Online

      • Using Code Examples

      • How to Contact Us

      • Acknowledgments

    • Introduction and Essential Concepts

      • System Programming

        • System Calls

          • Invoking system calls

        • The C Library

        • The C Compiler

      • APIs and ABIs

        • APIs

        • ABIs

      • Standards

        • POSIX and SUS History

        • C Language Standards

        • Linux and the Standards

        • This Book and the Standards

      • Concepts of Linux Programming

        • Files and the Filesystem

          • Regular files

          • Directories and links

          • Hard links

          • Symbolic links

          • Special files

          • Filesystems and namespaces

        • Processes

          • Threads

          • Process hierarchy

        • Users and Groups

        • Permissions

        • Signals

        • Interprocess Communication

        • Headers

        • Error Handling

      • Getting Started with System Programming

    • File I/O

      • Opening Files

        • The open() System Call

          • Flags for open()

        • Owners of New Files

        • Permissions of New Files

        • The creat() Function

        • Return Values and Error Codes

      • Reading via read()

        • Return Values

        • Reading All the Bytes

        • Nonblocking Reads

        • Other Error Values

        • Size Limits on read()

      • Writing with write()

        • Partial Writes

        • Append Mode

        • Nonblocking Writes

        • Other Error Codes

        • Size Limits on write()

        • Behavior of write()

      • Synchronized I/O

        • fsync( ) and fdatasync()

          • Return values and error codes

        • sync()

        • The O_SYNC Flag

        • O_DSYNC and O_RSYNC

      • Direct I/O

      • Closing Files

        • Error Values

      • Seeking with lseek()

        • Seeking Past the End of a File

        • Error Values

        • Limitations

      • Positional Reads and Writes

        • Error Values

      • Truncating Files

      • Multiplexed I/O

        • select()

          • Return values and error codes

          • select() example

          • Portable sleeping with select()

          • pselect()

        • poll()

          • Return values and error codes

          • poll() example

          • ppoll()

        • poll( ) Versus select()

      • Kernel Internals

        • The Virtual Filesystem

        • The Page Cache

        • Page Writeback

      • Conclusion

    • Buffered I/O

      • User-Buffered I/O

        • Block Size

      • Standard I/O

        • File Pointers

      • Opening Files

        • Modes

      • Opening a Stream via File Descriptor

      • Closing Streams

        • Closing All Streams

      • Reading from a Stream

        • Reading a Character at a Time

          • Putting the character back

        • Reading an Entire Line

          • Reading arbitrary strings

        • Reading Binary Data

      • Writing to a Stream

        • Writing a Single Character

        • Writing a String of Characters

        • Writing Binary Data

      • Sample Program Using Buffered I/O

      • Seeking a Stream

        • Obtaining the Current Stream Position

      • Flushing a Stream

      • Errors and End-of-File

      • Obtaining the Associated File Descriptor

      • Controlling the Buffering

      • Thread Safety

        • Manual File Locking

        • Unlocked Stream Operations

      • Critiques of Standard I/O

      • Conclusion

    • Advanced File I/O

      • Scatter/Gather I/O

        • readv( ) and writev()

          • Return values

          • writev() example

          • readv() example

          • Implementation

      • The Event Poll Interface

        • Creating a New Epoll Instance

        • Controlling Epoll

        • Waiting for Events with Epoll

        • Edge- Versus Level-Triggered Events

      • Mapping Files into Memory

        • mmap()

          • The page size

          • Return values and error codes

          • Associated signals

        • munmap()

        • Mapping Example

        • Advantages of mmap()

        • Disadvantages of mmap()

        • Resizing a Mapping

          • Return values and error codes

        • Changing the Protection of a Mapping

          • Return values and error codes

        • Synchronizing a File with a Mapping

          • Return values and error codes

        • Giving Advice on a Mapping

          • Return values and error codes

      • Advice for Normal File I/O

        • The posix_fadvise() System Call

          • Return values and error codes

        • The readahead() System Call

          • Return values and error codes

        • Advice Is Cheap

      • Synchronized, Synchronous, and Asynchronous Operations

        • Asynchronous I/O

          • Thread-based asynchronous I/O

      • I/O Schedulers and I/O Performance

        • Disk Addressing

        • The Life of an I/O Scheduler

        • Helping Out Reads

          • The Deadline I/O Scheduler

          • The Anticipatory I/O Scheduler

          • The CFQ I/O Scheduler

          • The Noop I/O Scheduler

        • Selecting and Configuring Your I/O Scheduler

        • Optimizing I/O Performance

          • Scheduling I/O in user space

      • Conclusion

    • Process Management

      • The Process ID

        • Process ID Allocation

        • The Process Hierarchy

        • pid_t

        • Obtaining the Process ID and Parent Process ID

      • Running a New Process

        • The Exec Family of Calls

          • The rest of the family

          • Error values

        • The fork() System Call

          • Copy-on-write

          • vfork()

      • Terminating a Process

        • Other Ways to Terminate

        • atexit()

        • on_exit()

        • SIGCHLD

      • Waiting for Terminated Child Processes

        • Waiting for a Specific Process

        • Even More Waiting Versatility

        • BSD Wants to Play: wait3( ) and wait4()

        • Launching and Waiting for a New Process

        • Zombies

      • Users and Groups

        • Real, Effective, and Saved User and Group IDs

        • Changing the Real or Saved User or Group ID

        • Changing the Effective User or Group ID

        • Changing the User and Group IDs, BSD Style

        • Changing the User and Group IDs, HP-UX Style

        • Preferred User/Group ID Manipulations

        • Support for Saved User IDs

        • Obtaining the User and Group IDs

      • Sessions and Process Groups

        • Session System Calls

        • Process Group System Calls

        • Obsolete Process Group Functions

      • Daemons

      • Conclusion

    • Advanced Process Management

      • Process Scheduling

        • Big-Oh Notation

        • Timeslices

        • I/O- Versus Processor-Bound Processes

        • Preemptive Scheduling

        • Threading

      • Yielding the Processor

        • Legitimate Uses

        • Yielding, Past and Present

      • Process Priorities

        • nice()

        • getpriority( ) and setpriority()

        • I/O Priorities

      • Processor Affinity

        • sched_getaffinity() and sched_setaffinity()

      • Real-Time Systems

        • Hard Versus Soft Real-Time Systems

        • Latency, Jitter, and Deadlines

        • Linux’s Real-Time Support

        • Linux Scheduling Policies and Priorities

          • The first in, first out policy

          • The round-robin policy

          • The normal policy

          • The batch scheduling policy

          • Setting the Linux scheduling policy

        • Setting Scheduling Parameters

          • Error codes

          • Determining the range of valid priorities

        • sched_rr_get_interval()

          • Error codes

        • Precautions with Real-Time Processes

        • Determinism

          • Prefaulting data and locking memory

          • CPU affinity and real-time processes

      • Resource Limits

        • The Limits

          • Default limits

        • Setting and Retrieving Limits

          • Error codes

    • File and Directory Management

      • Files and Their Metadata

        • The Stat Family

        • Permissions

        • Ownership

        • Extended Attributes

          • Keys and values

          • Extended attribute namespaces

          • Extended attribute operations

      • Directories

        • The Current Working Directory

          • Obtaining the current working directory

          • Changing the current working directory

        • Creating Directories

        • Removing Directories

        • Reading a Directory’s Contents

          • Reading from a directory stream

          • Closing the directory stream

          • System calls for reading directory contents

      • Links

        • Hard Links

        • Symbolic Links

        • Unlinking

      • Copying and Moving Files

        • Copying

        • Moving

      • Device Nodes

        • Special Device Nodes

        • The Random Number Generator

      • Out-of-Band Communication

      • Monitoring File Events

        • Initializing inotify

        • Watches

          • Adding a new watch

          • Watch masks

        • inotify Events

          • Reading inotify events

          • Linking together move events

        • Advanced Watch Options

        • Removing an inotify Watch

        • Obtaining the Size of the Event Queue

        • Destroying an inotify Instance

    • Memory Management

      • The Process Address Space

        • Pages and Paging

          • Sharing and copy-on-write

        • Memory Regions

      • Allocating Dynamic Memory

        • Allocating Arrays

        • Resizing Allocations

        • Freeing Dynamic Memory

        • Alignment

          • Allocating aligned memory

          • Other alignment concerns

      • Managing the Data Segment

      • Anonymous Memory Mappings

        • Creating Anonymous Memory Mappings

        • Mapping /dev/zero

      • Advanced Memory Allocation

        • Fine-Tuning with malloc_usable_size() and malloc_trim()

      • Debugging Memory Allocations

        • Obtaining Statistics

      • Stack-Based Allocations

        • Duplicating Strings on the Stack

        • Variable-Length Arrays

      • Choosing a Memory Allocation Mechanism

      • Manipulating Memory

        • Setting Bytes

        • Comparing Bytes

        • Moving Bytes

        • Searching Bytes

        • Frobnicating Bytes

      • Locking Memory

        • Locking Part of an Address Space

        • Locking All of an Address Space

        • Unlocking Memory

        • Locking Limits

        • Is a Page in Physical Memory?

      • Opportunistic Allocation

        • Overcommitting and OOM

    • Signals

      • Signal Concepts

        • Signal Identifiers

        • Signals Supported by Linux

      • Basic Signal Management

        • Waiting for a Signal, Any Signal

        • Examples

        • Execution and Inheritance

        • Mapping Signal Numbers to Strings

      • Sending a Signal

        • Permissions

        • Examples

        • Sending a Signal to Yourself

        • Sending a Signal to an Entire Process Group

      • Reentrancy

        • Guaranteed-Reentrant Functions

      • Signal Sets

        • More Signal Set Functions

      • Blocking Signals

        • Retrieving Pending Signals

        • Waiting for a Set of Signals

      • Advanced Signal Management

        • The siginfo_t Structure

        • The Wonderful World of si_code

      • Sending a Signal with a Payload

        • Example

      • Conclusion

    • Time

      • Time’s Data Structures

        • The Original Representation

        • And Now, Microsecond Precision

        • Even Better: Nanosecond Precision

        • Breaking Down Time

        • A Type for Process Time

      • POSIX Clocks

        • Time Source Resolution

      • Getting the Current Time of Day

        • A Better Interface

        • An Advanced Interface

        • Getting the Process Time

      • Setting the Current Time of Day

        • Setting Time with Precision

        • An Advanced Interface for Setting the Time

      • Playing with Time

      • Tuning the System Clock

      • Sleeping and Waiting

        • Sleeping with Microsecond Precision

        • Sleeping with Nanosecond Resolution

        • An Advanced Approach to Sleep

        • A Portable Way to Sleep

        • Overruns

        • Alternatives to Sleeping

      • Timers

        • Simple Alarms

        • Interval Timers

        • Advanced Timers

          • Creating a timer

          • Arming a timer

          • Obtaining the expiration of a timer

          • Obtaining the overrun of a timer

          • Deleting a timer

    • GCC Extensions to the C Language

      • GNU C

      • Inline Functions

      • Suppressing Inlining

      • Pure Functions

      • Constant Functions

      • Functions That Do Not Return

      • Functions That Allocate Memory

      • Forcing Callers to Check the Return Value

      • Marking Functions As Deprecated

      • Marking Functions As Used

      • Marking Functions or Parameters As Unused

      • Packing a Structure

      • Increasing the Alignment of a Variable

      • Placing Global Variables in a Register

      • Branch Annotation

      • Getting the Type of an Expression

      • Getting the Alignment of a Type

      • The Offset of a Member Within a Structure

      • Obtaining the Return Address of a Function

      • Case Ranges

      • Void and Function Pointer Arithmetic

      • More Portable and More Beautiful in One Fell Swoop

    • Bibliography

      • Books on the C Programming Language

      • Books on Linux Programming

      • Books on the Linux Kernel

      • Books on Operating System Design

    • Index

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan