Code:
A Program to utilize message queue for implementing the Merge sort(Socket Programming)

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include<stdlib.h>
#include<stdio.h>
#define MAXLINE 1000

struct mymesg
{
	long mtype;
	int a[4];
};
void Merge(int a[],int Merge[],int Ctr)
{
	if(Ctr==0)
	{
		Ctr+=4;
		for(int i=1;i<=Ctr;i++)
			Merge[i]=a[i];
	}
	else
	{
		for(int i=1;i<=4;i++)
		{
			int j=1;
			while(a[i]>Merge[j]&&j<=Ctr)j++;
			if(j>Ctr)
				Merge[j]=a[i];
			else
			{
				for(int k=Ctr;k>=j;k--)
					Merge[k+1]=Merge[k];
				Merge[j]=a[i];
			}
			Ctr++;
		}
	}
}
int main()
{
	int n,Id,Var2,Var1,b[17],Merge[17],Count=16;
	Var2=msgget(12,0666|IPC_CREAT);
	system("clear");
	printf("Elements are...
");
	for(int i=1;i<=Count;i++)
	{
		b[i]=rand()%150;
		printf("%d ",b[i]);
	}
	printf("

");
	int i,Ctr=1,gmax;n=4;Var1=0;gmax=4;
	for(i=1;i<=n;i++)
	{
		struct mymesg stPtr;
		stPtr.mtype=1;
		Id=fork();
		if (Id>0)
		{
			int k=0;
			printf("Group %d: ",i);
			for(int j=Ctr;j<=Ctr+gmax-1;j++)
			{
				stPtr.a[++k]=b[j];
				printf("%d ",stPtr.a[k]);
			}

			printf("
");
			msgsnd(Var2,&stPtr,MAXLINE,IPC_NOWAIT);
			waitId(Id,NULL,0);

			msgrcv(Var2,&stPtr,MAXLINE,0,IPC_NOWAIT);

			printf("Sorted Sub-Group %d: ",i);
			for(int j=1;j<=gmax;j++)
				printf("%d ",stPtr.a[j]);
			printf("

");

			Merge(stPtr.a,Merge,Ctr-1);

			if(Ctr==Count+1-gmax)
				break;
			Ctr+=gmax;
			continue;
		}
		else
		{
			msgrcv(Var2,&stPtr,MAXLINE,0,IPC_NOWAIT);

			for(int j=1;j<=gmax;j++)
			{
				for(int k=1;k<=gmax-j;k++)
				{
					if(stPtr.a[k]>stPtr.a[k+1])
					{
						int t=stPtr.a[k+1];
						stPtr.a[k+1]=stPtr.a[k];
						stPtr.a[k]=t;
					}
				}
			}
			stPtr.mtype=2;
			msgsnd(Var2,&stPtr,MAXLINE,IPC_NOWAIT);
			exit(0);
		}
	}
	printf("After Sorting");
	for(int i=1;i<=Count;i++)
		printf("%d ",Merge[i]);
 
	return 0;
}