Advanced Linux Programming_djvu.txt

(1385 KB) Pobierz
Advanced 

Linux 

Programming 



Contents At a Glance 

I Advanced UNIX Programming 
with Linux 

1 Getting Started 3 

2 Writing Good GNU/Linux 
Software 17 

3 Processes 45 

4 Threads 61 

5 Interprocess Communication 95 
II Mastering Linux 

6 Devices 129 

7 The /proc File System 147 

8 Linux System Calls 167 

9 Inline Assembly Code 189 

10 Security 197 

11 A Sample GNU/Linux 
Application 219 

III Appendixes 

A Other Development Tools 259 

B Low-Level I/O 281 

C Table of Signals 301 

D Online Resources 303 

E Open Publication License 
Version 1.0 305 



F GNU General Public License 309 



Advanced Linux 
Programming 



Mark Mitchell, Jeffrey Oldham, 
and Alex Samuel 



New 
Riders 

www.newriders.com 

201 West 103rd Street, Indianapolis, Indiana 46290 

An Imprint of Pearson Education 

Boston ??? Indianapolis ??? London ??? Munich ??? New York ??? San Francisco 



Advanced Linux Programming 

Copyright ?? 2001 by New Riders Publishing 

FIRST EDITION: June, 2001 

All rights reserved. No part of this book may be reproduced 
or transmitted in any form or by any means, electronic or 
mechanical, including photocopying, recording, or by any 
information storage and retrieval system, without written 
permission from the publisher, except for the inclusion of 
brief quotations in a review. 

International Standard Book Number: 0-7357-1043-0 

Library oi Congress Catalog Card Number: 00-105343 

05 04 03 02 01 7 6 5 4 3 2 1 

Interpretation of the printing code: The rightmost double- 
digit number is the year of the book's printing; the right- 
most single-digit number is the number of the book's 
printing. For example, the printing code 01-1 shows that the 
first printing of the book occurred in 2001. 

Composed in Bembo and MCPdigital by New Riders 
Publishing. 

Printed in the United States of America. 

Trademarks 

All terms mentioned in this book that are known to be 
trademarks or service marks have been appropriately capital- 
ized. New Riders Publishing cannot attest to the accuracy of 
this information. Use of a term in this book should not be 
regarded as affecting the validity of any trademark or service 
mark. 

PostScript is a trademark of Adobe Systems, Inc. 

Linux is a trademark of Linus Torvalds. 

Warning and Disclaimer 

This book is designed to provide information about 
Advanced Linux Programming. Every effort has been made to 
make this book as complete and as accurate as possible, but 
no warranty or fitness is implied. 

The information is provided on an as-is basis. The authors 
and New Riders Publishing shall have neither liability nor 
responsibility to any person or entity with respect to any loss 
or damages arising from the information contained in this 
book or from the use of the discs or programs that may 
accompany it. 



Publisher 

David Dwyer 

Associate Publisher 

AlValvano 

Executive Editor 

Stephanie Wall 

Managing Editor 

Gina Brown 

Acquisitions Editor 

Ann Quinn 

Development Editor 

Laura Loveall 

Product Marketing 
Manager 

Stephanie Layton 

Publicity Manager 

Susan Petro 

Project Editor 

Caroline Wise 

Copy Editor 

Krista Hansing 

Senior Indexer 

Cheryl Lenser 

Manufacturing 
Coordinator 

Jim Conway 

Book Designer 

Louisa Klucznik 

Cover Designer 

Brainstorm Design, Inc. 

Cover Production 

Aren Howell 

Proofreader 

Debra Neel 

Composition 

Amy Parker 




Table of Contents 



I Advanced UNIX Programming 
with Linux 1 

1 Getting Started 3 

1.1 Editing with Emacs 4 

1.2 Compiling with GCC 6 

1.3 Automating the Process with GNU 
Make 9 

1.4 Debugging with GNU Debugger 
(GDB) 11 

1.5 Finding More Information 13 

2 Writing Good GNU/Linux 
Software 17 

2.1 Interaction With the Execution 
Environment 17 

2.2 Coding Defensively 30 

2.3 Writing and Using Libraries 36 

3 Processes 45 

3.1 Looking at Processes 45 

3.2 Creating Processes 48 

3.3 Signals 52 

3.4 Process Termination 55 

4 Threads 61 

4.1 Thread Creation 62 

4.2 Thread Cancellation 69 

4.3 Thread-Specific Data 72 

4.4 Synchronization and Critical Sections 77 

4.5 GNU/Linux Thread Implementation 92 

4.6 Processes Vs. Threads 94 



Contents vii 



5 Interprocess Communication 95 

5.1 Shared Memory 96 

5.2 Processes Semaphores 101 

5.3 Mapped Memory 105 

5.4 Pipes 110 

5.5 Sockets 116 

II Mastering Linux 127 

6 Devices 129 

6.1 Device Types 130 

6.2 Device Numbers 130 

6.3 Device Entries 131 

6.4 Hardware Devices 133 

6.5 Special Devices 136 

6.6 PTYs 142 

6.7 hat 144 

7 The /proc File System 147 

7.1 Extracting Information from /proc 148 

7.2 Process Entries 150 

7.3 Hardware Information 158 

7.4 Kernel Information 160 

7.5 Drives, Mounts, and File Systems 161 

7.6 System Statistics 165 

8 Linux System Calls 167 

8.1 Using strace 168 

8.2 access: Testing File Permissions 169 

8.3 fcnth Locks and Other File 
Operations 171 

8.4 fsync and fdatasync: Flushing Disk 
Buffers 173 

8.5 getrlimit and setrlimit. Resource 
Limits 174 

8.6 getmsage: Process Statistics 175 

8.7 gettimeofday: Wall-Clock Time 176 



viii Contents 



8.8 The mlock Family: Locking Physical 
Memory 177 

8.9 mprotect: Setting Memory 
Permissions 179 

8.10 nanosleep: High-Precision Sleeping 181 

8.11 readlink: Reading Symbolic Links 182 

8.12 sendfile: Fast Data Transfers 183 

8.13 setitimer. Setting Interval Timers 185 

8.14 sysinfo: Obtaining System Statistics 186 

8.15 uname 187 

9 Inline Assembly Code 189 

9.1 When to Use Assembly Code 190 

9.2 Simple Inline Assembly 191 

9.3 Extended Assembly Syntax 192 

9.4 Example 194 

9.5 Optimization Issues 196 

9.6 Maintenance and Portability Issues 196 

10 Security 197 

10.1 Users and Groups 198 

10.2 Process User IDs and Process 
Group IDs 199 

10.3 File System Permissions 200 

10.4 Real and Effective IDs 205 

10.5 Authenticating Users 208 

10.6 More Security Holes 211 

11 A Sample GNU/Linux 
Application 219 

11.1 Overview 219 

11.2 Implementation 221 

11.3 Modules 239 

11.4 Using the Server 252 

11.5 Finishing Up 255 



Contents ix 



III Appendixes 257 

A Other Development Tools 259 

A. 1 Static Program Analysis 259 

A. 2 Finding Dynamic Memory Errors 261 

A.3 Profiling 269 

B Low-Level I/O 281 

B.l Reading and Writing Data 282 

B.2 stat 291 

B.3 Vector Reads and Writes 293 

B.4 Relation to Standard C Library I/O 
Functions 295 

B.5 Other File Operations 296 

B.6 Reading Directory Contents 296 

C Table of Signals 301 

D Online Resources 303 

D. 1 General Information 303 

D.2 Information About GNU/Linux 
Software 304 

D.3 Other Sites 304 

E Open Publication License 
Version 1.0 305 

I. Requirement on Both Unmodified and 
Modified Versions 305 

II. Copyright 306 

III. Scope of License 306 

IV Requirements on Modified Works 306 

V Good-Practice Recommendations 306 
VI. License Options 307 

Open Publication Policy Appendix 307 



Contents 



GNU General Public License 309 

Preamble 309 

Terms and Conditions for Copying, 
Distribution and Modification 310 

End of Terms and Conditions 315 

How to Apply These Terms to Your New 
Programs 315 

Index 317 



Table of Program Listings 

1.1 main.c (C source file), 6 

1.2 reciprocal. cpp (C++ source file), 6 

1.3 reciprocal. hpp (header file), 7 

2.1 arglist.c (argc and argv parameters), 18 

2.2 getopt_long.c (getopt_long function), 21 

2.3 print_env.c (printing execution 
environment), 26 

2.4 client. c (network client program), 26 

2.5 temp_file.c (mkstemp function), 28 

2.6 readfile.c (resource allocation during error 
checking), 35 

2.7 test.c (library contents), 37 

2.8 app.c (program with library functions), 37 

2.9 tifftest.c (libtiff library), 40 

3.1 print-pid.c (printing process IDs), 46 

3.2 system. c (system function), 48 

3.3 fork.c (fork function), 49 

3.4 fork-exec. c (fork and exec functions), 51 

3.5 sigusrl.c (signal handlers), 54 

3.6 zombie.c (zombie processes), 58 

3.7 sigchld.c (cleaning up child processes), 60 

4.1 thread-create. c (creating threads), 63 

4.2 thread-create2 (creating two threads), 
64 

4.3 thread-create2.c (revised main function), 65 

4.4 primes. c (prime number computation in a 
thread), 67 

4.5 detached.c (creating detached threads), 69 

4.6 critical-section. c (critical sections), 71 

4.7 tsd.c (thread-specific data), 73 

4.8 cleanup.c (cleanup handlers), 75 

4.9 cxx-exit.cpp (C++ thread cleanup), 76 

4.10 job-queuel.c (thread race conditions), 78 

4.11 job-queue2.c (mutexes), 80 

4.12 job-queue3.c (semaphores), 84 

4.13 spin-condvar.c (condition variables), 87 



Program Listings xiii 



4.14 condvar.c (condition variables), 90 

4.15 thread-pid (printing thread process IDs), 92 

5.1 shm.c (shared memory), 99 

5.2 sem_all_deall.c (semaphore allocation and 
deallocation), 102 

5.3 sem_init.c (semaphore initialization), 102 

5.4 sem_pv.c (semaphore wait and post 
operations), 104 

5.5 mmap-write.c (mapped memory), 106 

5.6 mmap-read.c (mapped memory), 107 

5.7 pipe.c (parent-child process 
communication), 111 

5.8 dup2.c (output redirection), 113 

5.9 popen.c (popen command), 114 

5.10 socket-server.c (local sockets), 120 

5.11 socket-client. c (local sockets), 121 

5.12 socket-inet.c (Internet-domain sockets), 124 

6.1 random_number.c (random number 
generation), 138 

6.2 cdrom-eject.c (ioctl example), 144 

7.1 clock-speed.c (cpu clock speed from 
/proc/cpuinfo), 149 

7.2 get-pid.c (process ID from /proc/self), 
151 

7.3 print-arg-list.c (printing process argument 
lists), 153 

7.4 print-environment. c (process environment), 
154 

7.5 get-exe-path.c (program executable path), 155 

7.6 open-and-spin.c (opening files), 157 

7.7 print-uptime.c (system uptime and idle time), 
165 

8.1 check-access. c (file access permissions), 170 

8.2 lock-file. c (write lo...
Zgłoś jeśli naruszono regulamin