System V IPC

Three forms of System V IPC

  • Semaphores

  • Message Queues

  • Shared Memory

System V IPC is different from POSIX API, but both are available in the linux kernel.

GNU C library in kernel version 2.2 includes the interfaces for shared memory and the semaphore according to POSIX.

Access Rights and Numbers

struct kern_ipc_perm


key_t key;  //key

uid_t uid; //Owner

gid_t gid;  //Owner

uid_t cuid;  //Creator

gid_t cgid; //Creator

mode_t mode; //Access Mode

unsigned long seq; //counter used to calculate the identifier


the user and group id needs 32bit for the Intel 32 bit architecture, so the kernel supported both the IPC_OLD and IPC_64.

Semaphores (System V)

  • Array of semaphores can be setup using the system calls
  • It is always possible to modify a number of semaphores.
  • They can be incremented or decremented in steps greater than 1.

Semaphores are created using the following structure

struct sem_array


struct kern_ipc_perm sem_perm; //access permission

time_t sem_otime; //time of the last semaphore operation

time_t sem_ctime; //time of the last change

struct sem *sem_base; //pointer to the first semaphore

struct sem_queue *sem_pending; //operation to be reversed

struct sem_queue **sem_pending_last; //last operation to be carried out

struct sem_undo *undo; //undo operation to be carried out

unsigned long sem_nsems:// Number of semaphores in this array


struct sem


int semval; //current value of the semaphore

int sempid; //Process ID of the last operation


Message Queues

  • Message consists of sequence of bytes and a code.
  • Processes send messages to the queue and can receive message
  • Messages are read in the same order in which they are entered in the message queue.

struct msg_queue


struct kern_ipc_perm q_perm; //Access rights

time_t q_stime; //time of last send

time_t q_rtime; //time of last receive

time_t q_ctime; //time of last change

unsigned long q_cbytes; //number of bytes in the queue

unsigned long q_qnum; //number of message in the queue

unsigned long q_qbytes; //capacity of wait queue in bytes

pid_t lspid; //pid of the last sender

pid_t q_lrpid; //pid of the last receiver


To send message, the processes use these functions

int sys_msgsnd(int msgid, struct msgbuf *magp, size_t msgsz, int msgflg);

int sys_msgrcv(int msgid, struct msgbuf *magp, size_t msgsz, long msgtyp, int msgflg)

Shared Memory

  • shared memory is the fastest form of Inter process communication
  • exchange data between processes using the machine code commands for reading and writing
  • the main drawback is that the processes need to use additional synchronization mechanism to avoid the race condition
  • Shared segment of memory is identified by a number.
  • The structure shmid_kernel is for the kernel segment and mapped to the user segment in the virtual address space by the processes with the help of attach function, the reverse action will be through the help of detach.

struct shmid_kernel


struct kern_ipc_perm shm_perm; //access rights

struct file *shm_file; //file in the shared memory

int id;

unsigned long shm_nattach; //number of attachments

unsigned long shm_segsz; //size of segment

time_t shm_atim; //time of last attach

time_t shm_dtim; //time of last detach

time_t shm_ctim; //time of creation

pid_t shm_cprid; //creator process id

pid_t shm_lprid; //process id of the last operation


Information for Semaphore, message queue and shared memory



semmni (maximum number of semaphore arrays)


semmns (maximum number of semaphores in the system


semmsl (number of semaphores per array)


semvmx (maximum value of semaphores




msgmni (maximum number of message queue)


msgmax (maximum size of a message in bytes)


msgmnb (standarad value for the maximum size of a message queue in bytes)




shmmni (maximum no of shared memory segment)


shmmax (maximum size of SHM segment in bytes)


shmmin (mi

nimum size of SHM segment in bytes)


shmseg (permitted no of segments/processes)



Popular Posts