Skip to main content

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 from this blog

Installation of NS2 (ns-2.35) in Ubuntu 20.04

Installation of NS2 (ns-2.35) in Ubuntu 20.04 LTS Step 1: Install the basic libraries like      $] sudo apt install build-essential autoconf automake libxmu-dev Step 2: install gcc-4.8 and g++-4.8 open the file using sudo mode $] sudo nano /etc/apt/sources.list Include the following line deb bionic main universe $] sudo apt update $] sudo apt install gcc-4.8 g++-4.8 Step 3:  Unzip the ns2 packages to home folder $] tar zxvf ns-allinone-2.35.tar.gz $] cd ns-allinone-2.35/ns-2.35 Modify the following make files. ~ns-2.35/ Change @CC@ to gcc-4.8 change @CXX@ to g++-4.8 ~nam-1.15/ ~xgraph-12.2/ ~otcl-1.14/ Change in all places  @CC@ to gcc-4.8 @CPP@ or @CXX@ to g++-4.8 open the file: ~ns-2.35/linkstate/ls.h Change at the Line no 137  void eraseAll() { erase(baseMap::begin(), baseMap::end()); } to This void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); } All changes made Step 4: Open a new termi

Installing ns-3.34 in Ubuntu 20.04

This post shows how to install ns 3.34 in Ubuntu 20.04 LTS Prerequisites: Fresh installation of Ubuntu Version 20.04 LTS  ns3.34 can be downloaded from here Follow the video link for complete step by step instructions on the installation.  This version fixes the compilation issues of (bug in ns3.33)  Issue the following commands after opening a terminal  $ sudo apt update $ sudo apt install g++ python3 python3-dev python-dev pkg-config sqlite3 python3-setuptools git qt5-default gir1.2-goocanvas-2.0 python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython3 openmpi-bin openmpi-common openmpi-doc libopenmpi-dev autoconf cvs bzr unrar openmpi-bin openmpi-common openmpi-doc libopenmpi-dev tcpdump wireshark libxml2 libxml2-dev Unzip or untar the ns-allinone-3.34.tar.bz2 in the home folder (in my case its /home/pradeepkumar) $ cd ns-allinone-3.34/ $ ./ --enable-examples --enable-tests  Once the installation is completed, you may get an output show

Installation of ns3 in Windows 10 and Windows 11 OS using WSL (Windows Subsystem for Linux)

This post shows how to install ns-3.33 in Windows 10 through WSL (Windows Subsystem for Linux) This posts works for Windows 11 also (I have tested it on a Windows 11 ISO and it works the Same way as mentioned in the following post.) This post will work for ns-3.3x version. Prerequisites : Install Windows Subsystem for Linux with GUI: Please refer the following video  System Information: OS used: Windows 10 and WSL (Ubuntu 20.04) GUI: XServer for Windows NS3 Version: ns-3.33 See the following complete video on how to install ns3 in Windows 10 Step 0 : Open XLaunch Step 1 :  Open WSL using PowerShell and open it as Administrator Command:/  wsl $ xfce4-session The GUI of Ubuntu Opens within Windows 10 OS. Step 2 : Download ns3 from website through Mozilla Firefox browser Step 3: Open a Terminal  $ sudo apt update $ sudo apt install build-essential autoconf automake libxmu-dev python3-pygraphviz cvs mercurial bzr git cmake p7zip-full python3-matplotlib python-tk python3-dev qt5-q