The book is divided into four major parts. Part One, ``Getting Started'', contains three short chapters covering the history of Linux, licenses and copyright issues, and the availability and locations of Linux documentation, mailing lists and other books and sources of information.
Part Two provides an introduction to the Linux development environment and tools. Some of the coverage is minimal; for example, the section on the GNU debugger, gdb, contains only a short list of the essential debugger commands and references to two other books which offer tutorials on the debugger. More extended coverage is given to memory debugging tools. This includes source examples and information about creating and using libraries. There is also brief but important coverage of make, the gcc compiler and its options, system calls and common error codes.
The twelve chapters of Part Three, ``System Programming'', comprise the bulk of the book. These chapters, as elsewhere, are heavily subdivided into subsections, which I found a little distracting on first reading, but quite convenient for relocating information later.
The authors give an excellent balance of breadth and depth of coverage, with chapters focusing on processes, simple and advanced file handling, directory operations, signals, job control, terminal handling, socket programming, dates and timing, random numbers and console programming. Virtually all of these topics are augmented with small source code examples.
A larger example program, ladsh, is a simplified UNIX command shell which is developed over the course of several chapters and eventually supports simple built-in commands, command execution, I/O redirection and job control. The final version of this program is 710 lines of code, and working through its development provides a good exercise in tying together some of the basic elements of Linux system programming.
Part Four describes a few important development libraries such as the S-Lang terminal library, the Berkeley database library and the popt option parsing library. This section also provides brief discussions of regular expressions, dynamic loading with dl, and the names and user databases.
Finally, three appendices cover direct I/O port access, the final source version of the ladsh program and the GNU licenses.
Overall, the book is well-organized and the writing and explanations are clear and concise. Although designed explicitly as a reference for experienced C programmers making the switch to Linux, I would recommend it as a good additional resource for anyone just beginning to learn C in a Linux environment.
Andrew Johnson is currently a full-time student working on a Ph.D. in physical anthropology and a part-time programmer and technical writer. He resides in Winnipeg, Manitoba with his wife and two sons and enjoys a good, dark ale whenever he can. He can be reached by e-mail at ajohnson@gpu.srv.ualberta.ca.