We wrote this book for experienced (or not-so-experienced, but eager-to-learn) programmers who want to develop Linux software or to port software from other platforms to Linux. This is the book we wish we had when we were learning to program for Linux, and the book we now keep on our desks for reference. As soon as we wrote the first three chapters of the first edition, we were using the drafts as reference material while we worked.
This second edition removes outdated information, adds new information, and introduces an online version. You can now browse and search the entire content of this book at http://ladweb.net/ to make this book even more useful to you.
Linux is designed to be similar to Unix. This book gives you a good background in Unix programming basics and style. Linux is not fundamentally different from Unix; it differs in some details, but no more than one Unix version typically differs from another Unix version. This book is very much a Unix programming guide that is written from a Linux viewpoint and with specific Linux information.
Linux also has unique extensions, such as its direct screen access capabilities (see Chapter 21), and it has features that are used more often on it than on other systems, such as the popt library (see Chapter 26). This book covers many of those extensions and features so that you can write programs that truly take advantage of Linux.
If you are a C programmer, but you know neither Unix nor Linux, reading this book cover-to-cover and working with the examples should put you well on the road to being a competent Linux programmer. With the aid of system-specific documentation, you should find the transition to any version of Unix easy.
If you are already a proficient Unix programmer, you will find that this book makes your transition to Linux easier. We have tried very hard to make it easy for you to find precisely the information you need to know. We also carefully and clearly cover topics that sometimes trip up even experienced Unix programmers, such as process and session groups, job control, and tty handling.
If you are already a Linux programmer, this book covers confusing topics clearly and will make many of your programming tasks easier. Nearly every chapter will stand alone for you, because you already possess the essential knowledge of Linux on which they are based. No matter how experienced you are, you will find material here that you will appreciate having at your elbow.
This book is different from typical Unix programming texts because it is unabashedly specific to a particular operating system. We do not try to cover all the differences between different Unix-like systems; to do so would not be useful to Linux programmers, Unix programmers, or C programmers unfamiliar with Linux or Unix. We know from our own experience that once you learn how to program well for any Unix-like system, the others are easy to learn.
This book does not cover all the details of Linux programming. It does not explain the basic interface specified by ANSI/ISO C other books do that quite well. It does not cover the wealth of other programming languages available for Linux, and it does not cover the graphical programming libraries that are identical no matter what system you are using. Instead, we point you to books that specialize in those areas. Without extraordinary verbosity, we cover the information you need to know to go from being a C programmer for another system, such as Windows, Macintosh, or even DOS, to being a C programmer for Linux.
Linux Application Development is written in four parts:
The first part introduces you to Linux the operating system, license terms, and online system documentation.
The second part covers the most important facets of the development environment the compilers, linker and loader, and some debugging tools that are not widely used on other platforms.
The third part is the heart of the book it describes the interface to the kernel and to system libraries that are meant primarily as an interface to the kernel. In this section, only Chapters 19, 20, and 21 are very Linux-specific; most of this section covers general Unix programming from a Linux perspective. A new chapter in this second edition, Chapter 22, covers the basics of writing secure programs.
The fourth part rounds out your knowledge it includes descriptions of some important libraries that provide interfaces that are more independent of the kernel. These libraries are, properly speaking, not Linux-specific, but several are used more often on Linux systems than on other systems.
If you are already familiar with Linux or Unix programming, you will be able to read the chapters in this book in any order, skipping any that do not interest you. If you are not familiar with either Linux or Unix, most of the chapters will stand alone, but you will probably want to read Chapters 1, 2, 4, 5, 9, 10, 11, and 14 first, as they give you most of what you need to know to read the other chapters. In particular, Chapters 10, 11, and 14 form the core of the Unix and Linux programming model.
The following books, although they may overlap a little here and there, mostly complement this book by being simpler, more advanced, or on related topics.
The C Programming Language, second edition [Kernighan, 1988] concisely teaches ANSI standard C programming, with scant reference to the operating system. It recommends that readers have either some programming knowledge or "access to a more knowledgeable colleague."
Practical C Programming [Oualline, 1993] teaches C programming and style in a step-by-step, easy-to-follow manner that is designed for people with no prior programming experience.
Programming with GNU Software [Loukides, 1997] is an introduction to the GNU programming environment, including chapters on running the C compiler, the debugger, the make utility, and the RCS source code control system.
Advanced Programming in the UNIX Environment [Stevens, 1992] covers most important Unix and Unix-like systems, although it predates Linux. It covers similar material to the final two parts of Linux Application Development: system calls and shared libraries. It also provides many examples and explains the difference between various Unix versions.
UNIX Network Programming [Stevens, 2004] thoroughly covers network programming, including legacy types of networking that are not available on Linux, at least as we write this. While reading this book, stick to the Berkeley socket interface (see Chapter 17) to maintain maximum portability. This book may be useful if you need to make a few slight changes to port your Linux network program to some brand of Unix.
A Practical Guide to Red Hat Linux 8 [Sobell, 2002] is a 1,500-page tome that contains introductions to using Linux, shell programming, and system administration. While this book does mention Red Hat Linux 8, most of the information it contains applies to all flavors of Linux. It also contains a summary reference to many of the utilities that are included with a Linux system.
Linux in a Nutshell [Siever, 2003] is smaller and shorter and concentrates on a summary utility reference derived from O'Reilly's earlier nutshell references.
Linux Device Drivers, second edition [Rubini, 1998] teaches those who have never touched operating system code, as well as those who have, how to write Linux device drivers.
See the bibliography on page 679 for an extensive list of related titles.
All the source code in this book comes from working examples that we have tested while writing. All of the source code in this book is available in electronic format at http://ladweb.net/ In the interest of clarity, some short source code segments check only for likely errors that document how the system works rather than check for all possible errors. However, in the full programs in the book and on our Web site, we have made an attempt (we are not perfect) to check for all reasonable errors.
This book will teach you which functions to use and how they fit together; we encourage you to learn also how to use the reference documentation, the great majority of which was included with your system. Chapter 3 discusses how to find online information on your Linux system.
Linux is a rapidly developing operating system, and by the time you read this book, some facts (although we hope little substance) will no doubt have changed. We wrote this book in reference to the Linux 2.6 kernel and the GNU C library version 2.3.
With your help, we will maintain a list of errata and changes on the World Wide Web at http://ladweb.net/errata.html
We welcome your comments sent to email@example.com. We will read your comments, although we cannot promise to respond to them individually.