Beej's Guide to Unix IPC
Total Page:16
File Type:pdf, Size:1020Kb
Beej's Guide to Unix IPC Brian “Beej Jorgensen” Hall [email protected] Version 1.1.2 December 15, 2010 Copyright © 2010 Brian “Beej Jorgensen” Hall This guide is written in XML using the vim editor on a Slackware Linux box loaded with GNU tools. The cover “art” and diagrams are produced with Inkscape. The XML is converted into HTML and XSL-FO by custom Python scripts. The XSL-FO output is then munged by Apache FOP to produce PDF documents, using Liberation fonts. The toolchain is composed of 100% Free and Open Source Software. Unless otherwise mutually agreed by the parties in writing, the author offers the work as-is and makes no representations or warranties of any kind concerning the work, express, implied, statutory or otherwise, including, without limitation, warranties of title, merchantibility, fitness for a particular purpose, noninfringement, or the absence of latent or other defects, accuracy, or the presence of absence of errors, whether or not discoverable. Except to the extent required by applicable law, in no event will the author be liable to you on any legal theory for any special, incidental, consequential, punitive or exemplary damages arising out of the use of the work, even if the author has been advised of the possibility of such damages. This document is freely distributable under the terms of the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 License. See the Copyright and Distribution section for details. Copyright © 2010 Brian “Beej Jorgensen” Hall Contents 1. Intro......................................................................................................................................................... 1 1.1. Audience 1 1.2. Platform and Compiler 1 1.3. Official Homepage 1 1.4. Email Policy 1 1.5. Mirroring 1 1.6. Note for Translators 2 1.7. Copyright and Distribution 2 2. A fork() Primer................................................................................................................................... 3 2.1. “Seek ye the Gorge of Eternal Peril” 3 2.2. “I'm mentally prepared! Give me The Button!” 4 2.3. Summary 5 3. Signals......................................................................................................................................................6 3.1. Catching Signals for Fun and Profit! 6 3.2. The Handler is not Omnipotent 8 3.3. What about signal() 9 3.4. Some signals to make you popular 9 3.5. What I have Glossed Over 10 4. Pipes.......................................................................................................................................................12 4.1. “These pipes are clean!” 12 4.2. fork() and pipe()—you have the power! 13 4.3. The search for Pipe as we know it 13 4.4. Summary 14 5. FIFOs.....................................................................................................................................................15 5.1. A New FIFO is Born 15 5.2. Producers and Consumers 15 5.3. O_NDELAY! I'm UNSTOPPABLE! 17 5.4. Concluding Notes 17 6. File Locking.......................................................................................................................................... 18 6.1. Setting a lock 18 6.2. Clearing a lock 19 6.3. A demo program 20 6.4. Summary 21 7. Message Queues....................................................................................................................................22 7.1. Where's my queue? 22 7.2. “Are you the Key Master?” 22 7.3. Sending to the queue 23 7.4. Receiving from the queue 24 7.5. Destroying a message queue 24 7.6. Sample programs, anyone? 25 7.7. Summary 27 8. Semaphores........................................................................................................................................... 28 8.1. Grabbing some semaphores 28 8.2. Controlling your semaphores with semctl() 29 8.3. semop(): Atomic power! 30 8.4. Destroying a semaphore 30 iii Contents 8.5. Sample programs 31 8.6. Summary 33 9. Shared Memory Segments...................................................................................................................34 9.1. Creating the segment and connecting 34 9.2. Attach me—getting a pointer to the segment 34 9.3. Reading and Writing 35 9.4. Detaching from and deleting segments 35 9.5. Concurrency 35 9.6. Sample code 36 10. Memory Mapped Files.......................................................................................................................38 10.1. Mapmaker 38 10.2. Unmapping the file 39 10.3. Concurrency, again?! 39 10.4. A simple sample 39 10.5. Summary 40 11. Unix Sockets........................................................................................................................................41 11.1. Overview 41 11.2. What to do to be a Server 41 11.3. What to do to be a client 43 11.4. socketpair()—quick full-duplex pipes 45 12. More IPC Resources.......................................................................................................................... 46 12.1. Books 46 12.2. Other online documentation 46 12.3. Linux man pages 46 iv 1. Intro You know what's easy? fork() is easy. You can fork off new processes all day and have them deal with individual chunks of a problem in parallel. Of course, its easiest if the processes don't have to communicate with one another while they're running and can just sit there doing their own thing. However, when you start fork()'ing processes, you immediately start to think of the neat multi- user things you could do if the processes could talk to each other easily. So you try making a global array and then fork()'ing to see if it is shared. (That is, see if both the child and parent process use the same array.) Soon, of course, you find that the child process has its own copy of the array and the parent is oblivious to whatever changes the child makes to it. How do you get these guys to talk to one another, share data structures, and be generally amicable? This document discusses several methods of Interprocess Communication (IPC) that can accomplish this, some of which are better suited to certain tasks than others. 1.1. Audience If you know C or C++ and are pretty good using a Unix environment (or other POSIXey environment that supports these system calls) these documents are for you. If you aren't that good, well, don't sweat it—you'll be able to figure it out. I make the assumption, however, that you have a fair smattering of C programming experience. As with Beej's Guide to Network Programming Using Internet Sockets1, these documents are meant to springboard the aforementioned user into the realm of IPC by delivering a concise overview of various IPC techniques. This is not the definitive set of documents that cover this subject, by any means. Like I said, it is designed to simply give you a foothold in this, the exciting world of IPC. 1.2. Platform and Compiler The examples in this document were compiled under Linux using gcc. They should compile anywhere a good Unix compiler is available. 1.3. Official Homepage This official location of this document is http://beej.us/guide/bgipc/. 1.4. Email Policy I'm generally available to help out with email questions so feel free to write in, but I can't guarantee a response. I lead a pretty busy life and there are times when I just can't answer a question you have. When that's the case, I usually just delete the message. It's nothing personal; I just won't ever have the time to give the detailed answer you require. As a rule, the more complex the question, the less likely I am to respond. If you can narrow down your question before mailing it and be sure to include any pertinent information (like platform, compiler, error messages you're getting, and anything else you think might help me troubleshoot), you're much more likely to get a response. For more pointers, read ESR's document, How To Ask Questions The Smart Way2. If you don't get a response, hack on it some more, try to find the answer, and if it's still elusive, then write me again with the information you've found and hopefully it will be enough for me to help out. Now that I've badgered you about how to write and not write me, I'd just like to let you know that I fully appreciate all the praise the guide has received over the years. It's a real morale boost, and it gladdens me to hear that it is being used for good! :-) Thank you! 1.5. Mirroring You are more than welcome to mirror this site, whether publicly or privately. If you publicly mirror the site and want me to link to it from the main page, drop me a line at [email protected]. 1. http://beej.us/guide/bgnet/ 2. http://www.catb.org/~esr/faqs/smart-questions.html 1 Beej's Guide to Unix IPC 2 1.6. Note for Translators If you want to translate the guide into another language, write me at [email protected] and I'll link to your translation from the main page. Feel free to add your name and contact info to the translation. Please note the license restrictions in the Copyright and Distribution section, below. Sorry, but due to space constraints, I cannot host the translations myself. 1.7. Copyright and Distribution Beej's Guide to Network Programming is Copyright © 2010 Brian “Beej Jorgensen” Hall. With specific exceptions for source code and translations, below, this work is licensed under the Creative Commons Attribution- Noncommercial- No Derivative Works 3.0 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. One specific exception to the “No Derivative Works” portion of the license is as follows: this guide may be freely translated into any language, provided the translation is accurate, and the guide is reprinted in its entirety. The same license restrictions apply to the translation as to the original guide. The translation may also include the name and contact information for the translator. The C source code presented in this document is hereby granted to the public domain, and is completely free of any license restriction. Educators are freely encouraged to recommend or supply copies of this guide to their students.