Slashdot Mirror


Advanced Unix Programming, 2nd Ed.

prostoalex writes "Advanced Unix Programming by Marc Rochkind is published by Addison-Wesley this year in its second edition. A book that has been considered a timeless classic, a title that saw its first edition back in 1985 and its second edition almost two decades later, in 2004. Where do you even start to review?" Read on below to see read prostoalex's evaluation. Advanced Unix Programming, 2nd Ed. author Marc Rochkind pages 736 publisher Addison Wesley Professional rating 9/10 reviewer Alex Moskalyuk ISBN 0131411543 summary An introduction and guided course through the world of Linux I/O and interprocess communications, with C++ source code provided for your viewing pleasure. More than 1100 functions explained.

Advanced Unix Programming (AUP) has been updated to include information relevant to Solaris, Linux, FreeBSD, Darwin and Mac OS X. Rochkind has added more than 200 system calls, according to the preface. But who is the book for?

First off, if you look at the table of contents, you will find that AUP is largely a book on input-output in Unix operating systems. The input-output varies from Basic (Chapter 2) and Advanced (Chapter 3) File I/O to Interprocess Communications (Chapters 6, 7), Network I/O (Chapter 8) and Terminal I/O (Chapter 4). The rest of the book consists of purely informational chapters on fundamental concepts of Unix operating systems (Chapter 1), working with threads and processes (Chapter 5) and signals and timers (Chapter 9).

If you get the impression that this is an academic title, you're not mistaken - if your university has some kind of Advanced Unix/Linux or Unix Networking course, they probably use some AUP material. Note that the book is not a how-to or manual on setting up Apache, Samba, FTP, various filesystems or Jabber servers - it does have a chapter on networking but teaches Unix I/O concepts from developer's perspective only, meaning you have to know C and C++. If you prefer to look at the source code, it's on the author's Web site.

There are two types of readers for AUP: those who start off programming in Unix/Linux, and those who are quite good at it, have read the first edition and are now wondering whether the second one is worth it.

If you are just starting with programming in Unix/Linux environment, don't let the word "Advanced" scare you off. The first chapter is pretty good in getting the reader up to speed with the concepts discussed in the book. It talks about such common tasks as getting the system to tell you what it has in terms of POSIX, getting a Unix box to tell you the date and time inside a C++ application, and counting your app's execution time. In many aspects, the second half of each chapter falls under O'Reilly cookbook format, where you are given a certain task and then provided the source code and explanations of what needs to be done to accomplish the task.

The author also "falls" into the trap of using some quick solutions only to "discover" that they do not work on all the systems. For example, subchapter 3.6.1 Reading Directories first tries to access the contents of the directory via ec_neg (fd = open (".", O_RDONLY) and ec_neg (nread = read (fd, buffer, sizeof(buffer))) only to find out that under Linux the call retrieves unhelpful "*** EISDIR (21: "Is a directory") ***" message. After that we are introduced into proper, not quick and dirty ways, to access Unix directories via opendir(), closedir() and readdir().

From experience, it looks like most of the people I know who own a copy of the first edition of AUP bought it because of its section on Interprocess Communications. The author does indeed provide a great learning and reference resource when in Chapter 5 he takes the reader through Unix processes and threads, explains how fork() works. The simple pop quizzes are there as well. A way to win friends and amuse the opposite sex during watercooler talks is to offer the following example:

void forktest (void)
{
int pid;
printf ("Start of test.\n");
pid = fork();
printf ("Returned %d.\n", pid);
}

Run this example as forktest and you will get a message:

Start of test.
Returned 11111.
Returned 0.

Run this test as forktest > tmp and suddenly the message in tmp file changes:

Start of test.
Returned 22222.
Start of test.
Returned 0.

Why is "Start of test" printed twice in the second example? Warning: the book contains an early spoiler in 5.5 fork System Call

By this point, you probably wonder whether the code examples will work on your system. The author tested the code on Solaris 8, SuSE Linux 8, FreeBSD 4.6 and Darwin (Mac OS X kernel) 6.8. In the preface, he talks about using a Windows box with SSH client to upload the code to the destination systems and run them there.

The book is very convenient to read; the chapter numbering system always gives you a good feel of where you are at. As reading of the entire book is not required, and a lot of people use AUP as a reference, an index containing just functions and system calls is included in Appendix D. Don't know what tcgetpgrp() does? The index will point you to 4.3.4. All the code is printed in monospace font, so it's quite easy to differentiate from the regular text. All the function definitions are boxed with function name, description and signature provided. The signature itself contains comments on what the parameter represents. They also are not saving whitespace on function samples, using the style where each line of source code and each { gets a separate line in text. Overall, more than 1100 functions are covered.

The book is quite practical, too, so don't think of it as pure API rehash. For example, in 8.4.3 (the chapter 8 deals with Networking), you are given the source code for a text-based browser that's written in less than 50 lines of code (although it doesn't quite understand HTML and just dumps everything to standard output).

Overall, if any part of your job description or hobby list includes Unix/Linux development, especially if it's high on that list, this book is a must have. Moreover, looking at the job market defined by keyword "unix", it looks like half the positions include some kind of "Sr." or "Architect" or "Networking" attribute, for which the knowledge provided in AUP would be indispensable.

You can purchase Advanced Unix Programming, 2nd Ed. from bn.com. Slashdot welcomes readers' book reviews -- to see your own review here, carefully read the book review guidelines, then visit the submission page.

14 of 143 comments (clear)

  1. Terminal I/O? by Not+The+Real+Me · · Score: 5, Funny

    That chapter alone tells me to avoid this book like the plague.

    1. Re:Terminal I/O? by Carnildo · · Score: 3, Funny

      Actually, I think terminal I/O would be a very useful thing. I'd love to be able to release a program that, when run by my enemies, would terminate them, preferably with extreme prejudice.

      --
      "They redundantly repeated themselves over and over again incessantly without end ad infinitum" -- ibid.
    2. Re:Terminal I/O? by Pike65 · · Score: 3, Funny

      Yeah, that stuff'll be the death of you.

      --
      "If being a geek means being passionate about something, then I pity those who aren't geeks." - Pike65
    3. Re:Terminal I/O? by TheAmazingRando · · Score: 2, Funny

      Where's "-1, Didn't get the joke" ?

      --
      The surest sign that intelligent life exists elsewhere in the universe is that it has never tried to contact us. --
  2. Interesting change of pace... by eidechse · · Score: 5, Funny

    ...in twenty years every other programming book I have will be in it's 123rd edition.

  3. Copyright infringement by sdjunky · · Score: 5, Funny

    You stole the following code from SCO did you not?

    void forktest (void)
    {
    int pid;
    printf ("Start of test.\n");
    pid = fork();
    printf ("Returned %d.\n", pid);
    }

    I'm certain you did. It's code and it can be used in Unix so it belongs to SCO.

  4. Re:Good UNIX Reference by Anonymous Coward · · Score: 2, Funny

    Nice sig you fu~1

  5. Um... by GoNINzo · · Score: 4, Funny
    If they were true programers, wouldn't this be the 1st edition? Cause if you start counting at 0...

    Or would that be the 10th edition?

    --
    Gonzo Granzeau
    "Nothing the god of biomechanics wouldn't let you into heaven for.." -Roy Batty
    1. Re:Um... by pclminion · · Score: 5, Funny
      Or would that be the 10th edition?

      You should call it the 10nd edition. It confuses people better that way.

  6. Oh Joy! by Sloh_One · · Score: 5, Funny

    Can't wait to buy this book, go home, and snuggle up to the cozy fire with my Advanced Unix Progamming book 2nd edition.

  7. First Edition? by WwWonka · · Score: 5, Funny

    A book that has been considered a timeless classic,

    I am an avid book collector who has appeared on "Antique Roadshow" and "Cover to Cover Classics". I consider myself an authority in this matter. I have touched original Guttenberg bibles, been in the presence of the "War and Peace" transcripts, thumbed through the notes of DaVinci...but never, and I mean never, have I stumbled across this true classic! Ebay, Sothebys, 7 Mile Fair in Racine, Wisconsin...NO WHERE have I been able to zero in on this rareity.

    I will gladly sacrifice a small fortune to be in same vicinity as this timeless classic known by a few rare collectors as "Advanced Unix Programming, 1st Edition." Extra if it is bound by that cool shiny metal spirally stuff.

  8. Fork() by nate+nice · · Score: 2, Funny

    I had an operating systems class and in it we had a discussion section where we learned various types of system calls, such as forking, mutexes, pipes etc. Our TA for the discussion was an asian grad student and when we learned about fork() he pronounced it "fuck()". It was great learning what happens when you instruct your program to "fuck()". Needless to say, all you would hear was held back laughter from the entire class. For some reason, it never got old, he always found new ways to make "fuck()" really, really funny

    --
    "If you are a dreamer, a wisher, a liar, A hope-er, a pray-er, a magic bean buyer ..."
  9. Something wrong in the code? by Espectr0 · · Score: 2, Funny

    I tried the forktest, and renamed the forktest function to main and ran it. It displays numbers like 731 and the > tmp does about the same.

    Am i doing something wrong?

    1. Re:Something wrong in the code? by AJWM · · Score: 2, Funny

      Am i doing something wrong?

      Yes. Before running the it the first way (stdout is the terminal), you need to wait until your system's process id counter is in the low 11100s -- check by using ps, top, or similar. That will ensure you get the "Returned 11111" output. (You might need to try it a few times.)

      Similarly before running it with the output directed to tmp, wait for the highest PID numbers returned by ps to get up to around 22218 before running it.

      Of course, if you don't care if your forked process IDs are exactly 11111 or 22222 as per the example, you can just ignore the actual values.

      (Which I assume (hope!) you knew.)

      --
      -- Alastair