Here are some books that describe some of the procedures I’ve discussed in this guide, as well as Unix details in specific:
Bach, Maurice J. The Design of the UNIX Operating System. Published by Prentice-Hall, 1986. ISBN 013201799764.
W. Richard Stevens. Unix Network Programming, volumes 1-2. Published by Prentice Hall. ISBNs for volumes 1-2: 013141155165, 013081081966.
W. Richard Stevens. Advanced Programming in the UNIX Environment. Published by Addison Wesley. ISBN 020143307967.
UNIX Network Programming Volume 2 home page68—includes source code from Stevens’ superfine book.
The Linux Programmer’s Guide69—in-depth section on IPC.
UNIX System Calls and Subroutines using C70—contains modest IPC information.
The Linux Kernel71—how the Linux kernel implements IPC.
There are Linux manual pages. If you run another flavor of Unix, please look at your own man pages, as these might not work on your system.
accept()72,bind()73,connect()74,dup()75,exec()76,exit()77,fcntl()78,fileno()79,fork()80,ftok()81,getpagesize()82,ipcrm83,ipcs84,kill85,kill()86,listen()87,lockf()88,lseek()89 (for the l_whence field in struct flock),mknod90,mknod()91,mmap()92,msgctl()93,msgget()94,msgsnd()95,munmap()96,open()97,pipe()98,ps99,raise()100,read()101,recv()102,semctl()103,semget()104,semop()105,send()106,shmat()107,shmctl()108,shmdt()109,shmget()110,sigaction()111,signal()112,sigpending()114,sigprocmask()115,sigsuspend()117,socket()118,socketpair()119,stat()120,wait()121,waitpid()122,write()123.https://beej.us/guide/bgnet↩︎
https://beej.us/guide/bgipc↩︎
https://beej.us/guide/bgipc/source/examples/fork1.c↩︎
Fun fact: when you hit CTRL-Z in the terminal while you’re running a program in the foreground, it sends a SIGSTOP to that process and the shell reports that it is stopped or suspended. If you then type fg, it’ll bring that process back to the foreground and send it SIGCONT to keep running where it left off.↩︎
https://beej.us/guide/bgipc/source/examples/sigint.c↩︎
https://en.wikipedia.org/wiki/Reentrancy_(computing)↩︎
https://beej.us/guide/bgipc/source/examples/sigcount.c↩︎
https://beej.us/guide/bgipc/source/examples/sigstrtok.c↩︎
And it uses write() because printf() is not reentrant!↩︎
https://beej.us/guide/bgipc/source/examples/sigusr.c↩︎
https://man.archlinux.org/man/sigaction.2↩︎
https://man.archlinux.org/man/sigwait.3↩︎
https://man.archlinux.org/man/sigwaitinfo.2↩︎
https://man.archlinux.org/man/sigtimedwait.2↩︎
https://man.archlinux.org/man/sigsuspend.2↩︎
https://man.archlinux.org/man/sigpending.2↩︎
https://man.archlinux.org/man/kill.2↩︎
https://man.archlinux.org/man/raise.3↩︎
https://man.archlinux.org/man/sigqueue.3↩︎
https://man.archlinux.org/man/sigemptyset.3↩︎
https://man.archlinux.org/man/sigfillset.3↩︎
https://man.archlinux.org/man/sigaddset.3↩︎
https://man.archlinux.org/man/sigdelset.3↩︎
https://man.archlinux.org/man/sigismember.3↩︎
https://man.archlinux.org/man/sigprocmask.2↩︎
https://man.archlinux.org/man/sigaltstack.2↩︎
https://man.archlinux.org/man/siginterrupt.3↩︎
https://man.archlinux.org/man/sigsetjmp.3↩︎
https://man.archlinux.org/man/siglongjmp.3↩︎
https://man.archlinux.org/man/signal.2↩︎
You can override this with SA_NODEFER in your sa_flags, but that’s a sure path to madness.↩︎
If you’re using POSIX threads, use the equivalent pthread_sigmask(), instead, to do this on a per-thread basis.↩︎
https://beej.us/guide/bgipc/source/examples/sigblock.c↩︎
https://beej.us/guide/bgnet/↩︎
https://beej.us/guide/bgnet/html/split/slightly-advanced-techniques.html#poll↩︎
https://beej.us/guide/bgnet/html/split/slightly-advanced-techniques.html#select↩︎
https://beej.us/guide/bgipc/source/examples/pipesig.c↩︎
https://beej.us/guide/bgipc/source/examples/pselect.c↩︎
https://beej.us/guide/bgipc/source/examples/pipe1.c↩︎
https://beej.us/guide/bgipc/source/examples/pipe2.c↩︎
https://beej.us/guide/bgipc/source/examples/pipe3.c↩︎
https://beej.us/guide/bgipc/source/examples/speak.c↩︎
https://beej.us/guide/bgipc/source/examples/tick.c↩︎
POSIX says PIPE_BUF will be at least 512 bytes. So that’s your portable safe zone.↩︎
https://beej.us/guide/bgipc/source/examples/lockdemo.c↩︎
https://en.wikipedia.org/wiki/POSIX↩︎
https://beej.us/guide/bgipc/source/examples/kirk.c↩︎
https://beej.us/guide/bgipc/source/examples/spock.c↩︎
https://beej.us/guide/bgipc/source/examples/semdemo.c↩︎
https://beej.us/guide/bgipc/source/examples/semdemo.c↩︎
https://beej.us/guide/bgipc/source/examples/semrm.c↩︎
Or whatever the current addictive FPS game is these days.↩︎
https://en.wikipedia.org/wiki/Concurrency↩︎
https://beej.us/guide/bgipc/source/examples/shmdemo.c↩︎
https://beej.us/guide/bgipc/source/examples/mmapdemo.c↩︎
https://beej.us/guide/bgipc/source/examples/mmap_anon.c↩︎
https://beej.us/guide/bgnet↩︎
https://beej.us/guide/bgnet↩︎
https://beej.us/guide/bgnet↩︎
https://man.archlinux.org/man/shutdown.2↩︎
https://beej.us/guide/bgipc/source/examples/echos.c↩︎
https://beej.us/guide/bgipc/source/examples/echoc.c↩︎
https://beej.us/guide/bgipc/source/examples/spair.c↩︎
https://beej.us/guide/url/unixdesign↩︎
https://beej.us/guide/url/unixnet1↩︎
https://beej.us/guide/url/unixnet2↩︎
https://beej.us/guide/url/advunix↩︎
http://www.kohala.com/start/unpv22e/unpv22e.html↩︎
http://tldp.org/LDP/lpg/node7.html↩︎
https://users.cs.cf.ac.uk/Dave.Marshall/C/↩︎
https://tldp.org/LDP/tlk/ipc/ipc.html↩︎
https://man.archlinux.org/man/accept.2↩︎
https://man.archlinux.org/man/bind.2↩︎
https://man.archlinux.org/man/connect.2↩︎
https://man.archlinux.org/man/dup.2↩︎
https://man.archlinux.org/man/exec.2↩︎
https://man.archlinux.org/man/exit.2↩︎
https://man.archlinux.org/man/fcntl.2↩︎
https://man.archlinux.org/man/fileno.3↩︎
https://man.archlinux.org/man/fork.2↩︎
https://man.archlinux.org/man/ftok.3↩︎
https://man.archlinux.org/man/getpagesize.2↩︎
https://man.archlinux.org/man/ipcrm.8↩︎
https://man.archlinux.org/man/ipcs.8↩︎
https://man.archlinux.org/man/kill.1↩︎
https://man.archlinux.org/man/kill.2↩︎
https://man.archlinux.org/man/listen.2↩︎
https://man.archlinux.org/man/lockf.2↩︎
https://man.archlinux.org/man/lseek.2↩︎
https://man.archlinux.org/man/mknod.1↩︎
https://man.archlinux.org/man/mknod.2↩︎
https://man.archlinux.org/man/mmap.2↩︎
https://man.archlinux.org/man/msgctl.2↩︎
https://man.archlinux.org/man/msgget.2↩︎
https://man.archlinux.org/man/msgsnd.2↩︎
https://man.archlinux.org/man/munmap.2↩︎
https://man.archlinux.org/man/open.2↩︎
https://man.archlinux.org/man/pipe.2↩︎
https://man.archlinux.org/man/ps.1↩︎
https://man.archlinux.org/man/raise.3↩︎
https://man.archlinux.org/man/read.2↩︎
https://man.archlinux.org/man/recv.2↩︎
https://man.archlinux.org/man/semctl.2↩︎
https://man.archlinux.org/man/semget.2↩︎
https://man.archlinux.org/man/semop.2↩︎
https://man.archlinux.org/man/send.2↩︎
https://man.archlinux.org/man/shmat.2↩︎
https://man.archlinux.org/man/shmctl.2↩︎
https://man.archlinux.org/man/shmdt.2↩︎
https://man.archlinux.org/man/shmget.2↩︎
https://man.archlinux.org/man/sigaction.2↩︎
https://man.archlinux.org/man/signal.2↩︎
https://man.archlinux.org/man/signal.7↩︎
https://man.archlinux.org/man/sigpending.2↩︎
https://man.archlinux.org/man/sigprocmask.2↩︎
https://man.archlinux.org/man/sigsetopts.2↩︎
https://man.archlinux.org/man/sigsuspend.2↩︎
https://man.archlinux.org/man/socket.2↩︎
https://man.archlinux.org/man/socketpair.2↩︎
https://man.archlinux.org/man/stat.2↩︎
https://man.archlinux.org/man/wait.2↩︎
https://man.archlinux.org/man/waitpid.2↩︎
https://man.archlinux.org/man/write.2↩︎