Open-Source Wikis

/

Linux

/

Subsystems

/

IPC (System V)

torvalds/linux

IPC (System V)

Purpose

ipc/ implements the System V IPC primitives: message queues (msgget/msgsnd/msgrcv), semaphores (semget/semop), and shared memory (shmget/shmat). It also implements POSIX message queues (mq_open, mq_send, mq_receive).

This is a small directory by code volume but historically important. Modern code uses other primitives (futex, eventfd, pipe, file-backed mappings, shm_open).

Directory layout

ipc/
├── Makefile
├── util.{c,h}         # Common idr / shared init
├── ipc_sysctl.c       # /proc/sys/kernel/* knobs (msgmax, semmsl, shmmax, …)
├── msg.c              # SysV msgqueues
├── msgutil.c          # Message helper
├── sem.c              # SysV semaphores
├── shm.c              # SysV shared memory (uses shmem.c under mm)
├── mqueue.c           # POSIX message queues
├── mq_sysctl.c        # POSIX mq sysctls
├── compat.c           # 32-bit compat shims
├── namespace.c        # IPC namespace lifecycle
└── syscall.c          # The IPC multiplex syscall on archs that have it

Key abstractions

Symbol File Purpose
struct ipc_namespace include/linux/ipc_namespace.h Per-namespace tables (msg, sem, shm).
struct kern_ipc_perm include/linux/ipc.h Common header (uid/gid/mode/key) for IPC objects.
struct shmid_kernel ipc/shm.c A SysV shared memory segment.
struct msg_queue ipc/msg.c A SysV message queue.
struct sem_array ipc/sem.c A SysV semaphore set.

How it works

graph LR
    APP[User app] -->|msgget/semget/shmget| IPC[ipc/*.c]
    IPC -->|namespace| NS[ipc_namespace]
    IPC -->|allocate id| IDR[idr]
    APP -->|shmat/shmdt| SHM[ipc/shm.c]
    SHM --> SHMEM[mm/shmem.c]
    APP -->|mq_send/mq_receive| MQ[ipc/mqueue.c]
    MQ --> VFS[fs/]
  • SysV objects are addressed by integer IDs, allocated in an idr per namespace. Their kern_ipc_perm carries a key (IPC_PRIVATE or user-supplied).
  • SysV shared memory is implemented on top of tmpfs/shmem (mm/shmem.c). shmat maps the underlying file into the caller's address space.
  • POSIX message queues (mq_*) are exposed through a separate mqueue filesystem mounted at /dev/mqueue.
  • Sysctls in /proc/sys/kernel/ (msgmax, msgmnb, msgmni, semmsl, semopm, sem*, shmmax, shmall, shmmni) are owned here.

Integration points

  • kernel/: namespaces, sysctl.
  • mm/: SysV shm uses shmem.
  • fs/: POSIX mqueue is its own filesystem.
  • security/: LSM hooks for ipc_perm checks.

Key source files

File Purpose
ipc/util.c Shared id allocation, lookup, init.
ipc/shm.c SysV shared memory.
ipc/sem.c SysV semaphores.
ipc/msg.c SysV message queues.
ipc/mqueue.c POSIX mqueues.
ipc/namespace.c IPC namespace lifecycle.
ipc/ipc_sysctl.c sysctl knobs.

Entry points for modification

  • Most modification here is bug fixes, namespace fixes, or adding new sysctls. New SysV primitives are not added; the modern primitives (futex, pipe, memfd, io_uring) are preferred.

Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.

IPC (System V) – Linux wiki | Factory