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; }
Bookmarks