UNIX Network Programming: Interprocess communications

W. Richard Stevens

Mentioned 7

Well-implemented interprocess communications (IPC) are key to the performance of virtually every non-trivial UNIX program. This book provides coverage of various forms of IPC, including message passing, synchronization, shared memory, and Remote Procedure Calls (RPC). It offers a basic introduction to IPC and the problems it is intended to solve.

More on Amazon.com

Mentioned in questions and answers.

Are there any good books for a relatively new but not totally new *nix user to get a bit more in depth knowledge (so no "Linux for dummies")? For the most part, I'm not looking for something to read through from start to finish. Rather, I'd rather have something that I can pick up and read in chunks when I need to know how to do something or whenever I have one of those "how do I do that again?" moments. Some areas that I'd like to see are:

  • command line administration
  • bash scripting
  • programming (although I'd like something that isn't just relevant for C programmers)

I'd like this to be as platform-independent as possible (meaning it has info that's relevant for any linux distro as well as BSD, Solaris, OS X, etc), but the unix systems that I use the most are OS X and Debian/Ubuntu. So if I would benefit the most from having a more platform-dependent book, those are the platforms to target.

If I can get all this in one book, great, but I'd rather have a bit more in-depth material than coverage of everything. So if there are any books that cover just one of these areas, post it. Hell, post it even if it's not relevant to any of those areas and you think it's something that a person in my position should know about.

I've wiki'd this post - could those with sufficient rep add in items to it.

System administration, general usage books

Programming:

Specific tools (e.g. Sendmail)

Various of the books from O'Reilly and other publishers cover specific topics. Some of the key ones are:

Some of these books have been in print for quite a while and are still relevant. Consequently they are also often available secondhand at much less than list price. Amazon marketplace is a good place to look for such items. It's quite a good way to do a shotgun approach to topics like this for not much money.

As an example, in New Zealand technical books are usurously expensive due to a weak kiwi peso (as the $NZ is affectionately known in expat circles) and a tortuously long supply chain. You could spend 20% of a week's after-tax pay for a starting graduate on a single book. When I was living there just out of university I used this type of market a lot, often buying books for 1/4 of their list price - including the cost of shipping to New Zealand. If you're not living in a location with tier-1 incomes I recommend this.

E-Books and on-line resources (thanks to israkir for reminding me):

  • The Linux Documentation project (www.tldp.org), has many specific topic guides known as HowTos that also often concern third party OSS tools and will be relevant to other Unix variants. It also has a series of FAQ's and guides.

  • Unix Guru's Universe is a collection of unix resources with a somewhat more old-school flavour.

  • Google. There are many, many unix and linux resources on the web. Search strings like unix commands or learn unix will turn up any amount of online resources.

  • Safari. This is a subscription service, but you can search the texts of quite a large number of books. I can recommend this as I've used it. They also do site licences for corporate customers.

Some of the philosophy of Unix:

I recommend the Armadillo book from O'Reilly for command line administration and shell scripting.

alt text

Jason,

Unix Programming Environment by Kernighan and Pike will give you solid foundations on all things Unix and should cover most of your questions regarding shell command line scripting etc.

The Armadillo book by O'Reilly will add the administration angle. It has served me well!

Good luck!

The aforementioned Unix Power Tools is a must. Other classics are sed&awk and Mastering Regular Expressions. I also like some books from the O'Reilly "Cookbook" series:

  1. What are the differences between System V IPC and POSIX IPC ?
  2. Why do we have two standards ?
  3. How to decide which IPC functions to use ?
  • Systen V and POSIX IPC are two different, but related implementations of the same thing.

"Unix System V, commonly abbreviated SysV (and usually pronounced—though rarely written—as "System Five"), is one of the first commercial versions of the Unix operating system. It was originally developed by American Telephone & Telegraph (AT&T) and first released in 1983."

-Wikipedia

"POSIX or "Portable Operating System Interface [for Unix]" is the name of a family of related standards specified by the IEEE to define the application programming interface (API)"

-Wikipedia

  • Systm V was there earlier. POSIX evolved out of the standardization initiative by IEEE.

  • GNU/Linux is partially compliant with POSIX. Which one to use depends on which OS you are using this IPC. Most vendors are moving towards POSIX.

Unix Network Programming: Interprocess Communications v. 2 by Richard Stevens gives a good look into both of these.

Unix Network Programming

How to migrate to *nix platform after spending more than 10 years on windows? Which flavor will be easy to handle to make me more comfortable and then maybe I can switch over to more stadard *nix flavors? I have been postponing for a while now. Help me with the extra push.

Linux is the most accessible and has the most mature desktop functionality. BSD (in its various flavours) has less userspace baggage and would be easier to understand at a fundamental level. In this regard it is more like a traditional Unix than a modern Linux distribution. Some might view this as a good thing (and from certain perspectives it is) but will be more alien to someone familiar with Windows.

The main desktop distributions are Ubuntu and Fedora. These are both capable systems but differ somewhat in their userspace architecture The tooling for the desktop environment and default configuration for system security works a bit differently on Ubuntu than it does on most other Linux or Unix flavours but this is of little relevance to development. From a user perspective either of these would be a good start.

From a the perspective of a developer, all modern flavours of Unix and Linux are very similar and share essentially the same developer tool chain. If you want to learn about the system from a programmer's perspective there is relatively little to choose.

Most unix programming can be accomplished quite effectively with a programmer's editor such as vim or emacs, both of which come in text mode and windowing flavours. These editors are very powerful and have rather quirky user interfaces - the user interfaces are ususual but contribute significantly to the power of the tools. If you are not comfortable with these tools, this posting discusses several other editors that offer a user experience closer to common Windows tooling.

There are several IDEs such as Eclipse that might be of more interest to someone coming off Windows/Visual Studio.

Some postings on Stackoverflow that discuss linux/unix resources are:

If you have the time and want to do a real tour of the nuts and bolts Linux From Scratch is a tutorial that goes through building a linux installation by hand. This is quite a good way to learn in depth.

For programming, get a feel for C/unix from K&R and some of the resources mentioned in the questions linked above. The equivalent of Petzold, Prosise and Richter in the Unix world are W Richard Stevens' Advanced Programming in the Unix Environment and Unix Network Programming vol. 1 and 2.

Learning one of the dynamic languages such as Perl or Python if you are not already familiar with these is also a useful thing to do. As a bonus you can get good Windows ports of both the above from Activestate which means that these skills are useful on both platforms.

If you're into C++ take a look at QT. This is arguably the best cross-platform GUI toolkit on the market and (again) has the benefit of a skill set and tool chain that is transferrable back into Windows. There are also several good books on the subject and (as a bonus) it also works well with Python.

Finally, Cygwin is a unix emulation layer that runs on Windows and gives substantially unix-like environment. Architecturally, Cygwin is a port of glibc and the crt (the GNU tool chain's base libraries) as an adaptor on top of Win32. This emulation layer makes it easy to port unix/linux apps onto Cygwin. The platform comes with a pretty complete set of software - essentially a full linux distribution hosted on a Windows kernel. It allows you to work in a unix-like way on Windows without having to maintain a separate operating system installations. If you don't want to run VMs, multiple boots or multiple PCs it may be a way of easing into unix.

Signals seem to be one of those areas that should be conceptually simple and easy to explain but I have never come across one source that is both comprehensive, lucidly written, and up to date. In part this seems to be because of historical cruft, lots of exceptions to rules, different programming standards, the confusion threads throw into the mix, real-time additions, etc.

What's your best written, most complete source on unix/linux/posix signals? Web sites, books, stone tablets, whatever, are acceptable.

W. Richard Stevens is hard to beat on most things UNIX. I own at least 5 of his books and I think they are classics that should be on any UNIX System Programmer's shelf. Cheers.

UNIX Network Programming, Vol 2. Second Edition here http://www.amazon.com/UNIX-Network-Programming-Interprocess-Communications/dp/0130810819

I’m a C# and Java serverside windows programmer by day and want to learn C++ on Unix in my spare time.

I have very limited knowledge of C++ (from my university days).

I currently own a dell laptop running Vista. Should I create a dual boot system or buy a new machine?

Which Unix OS should I go for?

Which IDE should I use? …. NetBeans looks ok?

Which books should I read? I’m interested in texts covering the fundamentals, libraries, network programming, distributed systems.

Thanks

Books advice:

IDE: my favorite choice would be Eclipse, which has a c++ plugin (and many more interesting plugins), but I would also advice you to learn to use at least one among the Sacred Monsters: VI/VIM and Emacs.

OS: I would go for a dual boot system with some linux distro, maybe Ubuntu.

I think you could go for Dual boot as klez pointed out.

I have a HP2000z dual boot with XP and Ubuntu, and i really like Ubuntu a lot!

For C++, you could give Code::Blocks a try. Its open source.

Adding to orsogufo, I also suggest Unix Network programming Vol I and Vol II by Richard Stevens for Network related topics.

I'd like to do some hobby development of command line applications for UNIX in C. To narrow that down, I'd like to focus on the BSD family, specifically FreeBSD as my development machine is a Mac OS X 10.7 Lion box.

Searches for UNIX development have returned some from Addison Wesley, but I cannot find adequate documentation for FreeBSD. If there is a good general book on developing for either BSD or AT&T UNIX, I would be interested in that. please note I prefer books as I learn best that way.

Thanks,

Scott

Stevens "Advanced Programming in the Unix Environment". It covers FreeBSD but it's not FreeBSD specific. It is Unix specific, and covers all the bases you require.

I guess you could take a look at these:

Programming with POSIX Threads

The sockets Networking API

Interprocess Communications

Advanced Programming in the UNIX environment

The first three are very specific and would serve only if you need to focus on that particular subject. The last link is a highly rated book on Amazon that you may be interested in.

All in all, if you already have a grip of threads, IPC, networking, filesystem, all you need is the internet because there is widely available documentation about the POSIX API.

I have 10 processes running, each writing to the same file. I don't want multiple writers, so basically I am looking for a mutex/binary semaphore to protect file writes. The problem is I can't share the semaphore amongst 10 processes, so I am looking at using shared memory between 10 processes, and putting the semaphore inside shared memory so it can be accessed by each process.

Can anyone point me to documentation on this in C/C++ for Unix? Sample code to use this structure would be great.

Thanks

Take a look at UNIX Network Programming Vol. 2 by W. Richard Stevens.

It is a best book ever written on this subject.