# 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"int main()
{
int iNumber;
int iCount; // Counter Variableint *fact,*index,*lock; // Shared Variablesint shmidsum,shmidindex,shmidlock; // ShmID's For 3 Shared Variables int i; // For Storing Index Value in Processesint id; // To Store ID of the Processesint nproc=5; // Number of Processesint parfact;
fact=(int*)sshared(sizeof(int),&shmidsum);
index=(int*)sshared(sizeof(int),&shmidindex);
lock=(int*)sshared(sizeof(int),&shmidlock);
*fact=1;
*index=2;
printf("Enter Number to Find Factorial :");
scanf("%d",&iNumber);
spin_lock_init(lock);
id=process_fork(nproc);
parfact=1;
while(1)
{
spin_lock(lock);
// Critical Region
i=*index;
*index=*index + 1;
spin_unlock(lock);
if(i>iNumber)
{
break; // Exit the While Loop When// Becomes > arrSize
}
parfact=parfact * i;
}
spin_lock(lock);
// Critical Region
*fact=*fact * parfact;
spin_unlock(lock);
printf("\nPartial Factorial of Process:%d is %d",id,parfact);
process_join(nproc,id);
printf("\n Final Factorial is : %d\n", *fact);
// Cleaning Shared Memory
cleanup_memory(&shmidindex);
cleanup_memory(&shmidsum);
cleanup_memory(&shmidlock);
return 0;
}
/*
Enter Number to Find Factorial :5
Partial Factorial of Process:1 is 120
Partial Factorial of Process:2 is 1
Partial Factorial of Process:3 is 1
Partial Factorial of Process:4 is 1
Partial Factorial of Process:0 is 1
Final Factorial is : 120
*/