In the Linux world, there are many interprocess communication (IPC) methods available for system programmers. After some web searching, I found that there are rarely blogs or books that summarize them all. This article roughly lists them all with minimal explanation and some links to official manuals.
POSIX IPCs
POSIX-flavor IPCs include semaphores, shared memory, and message queues.
semaphore
There are also two subtypes of semaphores: named and unnamed. For details, see man 7 sem_overview.
sem_getvalue(3)
sem_post(3)
sem_wait(3)
sem_trywait(3)
sem_timedwait(3)
sem_open(3) // named
sem_close(3) // named
sem_unlink(3) // named
sem_init(3) // unnamed
sem_destroy(3) // unnamed
shared memory
POSIX shared memory (shm) IPC only has named version, the shm objects are stored in Linux tmpfs (by default /dev/shm).
shm_open (3)
shm_unlink (3)
message queue
POSIX message queue (mq) IPC objects are also named, but they are stored in a special filesystem, mqueue. A mqueue filesystem can be mounted with the following command,
mount -t mqueue none /dev/mqueue
The libc APIs and their syscall counterparts are listed below, details see man 7 mq_overview.
Library interface System call
mq_close(3) close(2)
mq_getattr(3) mq_getsetattr(2)
mq_notify(3) mq_notify(2)
mq_open(3) mq_open(2)
mq_receive(3) mq_timedreceive(2)
mq_send(3) mq_timedsend(2)
mq_setattr(3) mq_getsetattr(2)
mq_timedreceive(3) mq_timedreceive(2)
mq_timedsend(3) mq_timedsend(2)
mq_unlink(3) mq_unlink(2)
SystemV / XSI IPCs
Similar to the POSIX IPCs, SystemV/XSI-flavor IPCs have the same three types IPCs under Linux: semaphore, shared memory, and message queue. For details, see man 7 sysvipc.
semaphore
semget(2) // Create a new set or obtain the ID of an existing set. This call returns an identifier that is used in the remaining APIs.
semop(2) // Perform operations on the semaphores in a set.
semctl(2) // Perform various control operations on a set, including deletion.
shared memory
shmget(2) // Create a new segment or obtain the ID of an existing segment. This call returns an identifier that is used in the remaining APIs.
shmat(2) // Attach an existing shared memory object into the calling process's address space.
shmdt(2) // Detach a segment from the calling process's address space.
shmctl(2) // Perform various control operations on a segment, including deletion.
message queue
msgget(2) // Create a new message queue or obtain the ID of an existing message queue. This call returns an identifier that is used in the remaining APIs.
msgsnd(2) // Add a message to a queue.
msgrcv(2) // Remove a message from a queue.
msgctl(2) // Perform various control operations on a queue, including deletion.
UNIX IPCs
There are some IPCs widely implemented in UNIX-like OSs, but not specified in the POSIX standard. These include pipe, FIFO, signal, and unix domain socket.
Pipe & FIFO
The pipe IPC and FIFO are fundamentally the same, except that FIFO is named while pipe is not.
popen(3) // pipe
pclose(3) // pipe
mkfifo(3) // FIFO
mkfifoat(3) // FIFO
Signal
For details see man 7 signal.
signal(2)
sigaction(2)
kill(2)
sigprocmask(2)
sigpending(2)
sigsuspend(2)
// and more ...
Unix Domain Socket
Unix domain sockets (UDS) use the socket programming interface for local IPC. For details, see man 7 unix.
socket(AF_UNIX, ...) (2)
Modern Linux IPCs
Binder
The binder IPC was initially implemented for the Android OS and has been merged into Linux upstream.
For details, see The Android binderfs Filesystem — The Linux Kernel documentation.
DBus / kdbus
The DBus IPC is now widely used. It is implemented in userspace. Efforts are made towards a kernel version (kdbus), but it has not been merged upstream. For details, see dbus (www.freedesktop.org).