# include <stdio.h>
# include "/usr/include/sys/types.h"
# include "/usr/include/sys/shm.h"
# include "/usr/include/sys/ipc.h"
# include "/usr/include/sys/sem.h"
# include "forkjoin.h"
# include "sharedlib.h"
# include "spinlock.h"
# include "barrier.h"int main()
{
// Note that Array Starts from Base 1 int arrSize=9;
int *arr;
int arrold[9]; // For Holding boundary Cellsint id; // Process Identificationint nProc=3; // Number of Processesint *bararr; // Barrier Array int shmidbararr,shmidarr; // Shmid For Shared Variablesint blocksize = arrSize/nProc; // Calculating Block Sizeint index,iCount;
arr=(int*)sshared(sizeof(int)*10,&shmidarr);
printf("Original Array ...\n");
for(iCount=1;iCount<=arrSize+1;iCount++)
{
arr[iCount]=iCount; // Assignning Array Values
printf("arr[%d] : %d\n",iCount,arr[iCount]);
}
bararr=(int*)sshared(sizeof(int)* 4,&shmidbararr);
barrier_init(bararr,nProc); // Initialize Barrier Array
id=process_fork(nProc); //Forking Process
arrold[id]=arr[blocksize * (id+1) + 1]; // Copying Boundary Values
barrier(bararr); // Calling Barrier
index=id * blocksize; // Calculating Start Index for Each Blockfor(iCount=1;iCount<blocksize;iCount++)
{
arr[index+iCount]=arr[index + iCount + 1];
}
arr[blocksize*(id+1)] = arrold[id]; //Assigning Boundary Values
process_join(nProc,id); // Joining Process
printf("After Copy ...\n");
for(iCount=1;iCount<=arrSize;iCount++)
{
printf("arr[%d] = %d\n",iCount,arr[iCount]);
}
cleanup_memory(&shmidbararr);
cleanup_memory(&shmidarr);
return 0;
}
/* Output
[divyen@localhost pp-tw3]$ cc -o Prog04 Prog04.c
[divyen@localhost pp-tw3]$ ./Prog04
Original Array ...
arr[1] : 1
arr[2] : 2
arr[3] : 3
arr[4] : 4
arr[5] : 5
arr[6] : 6
arr[7] : 7
arr[8] : 8
arr[9] : 9
arr[10] : 10
After Copy ...
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
arr[5] = 6
arr[6] = 7
arr[7] = 8
arr[8] = 9
arr[9] = 10
*/