Reputation: 746
I am a starter to work with shared memory and I have implemented a parallel adder in which each of the k processors is implemented as a child process. Specifically, given a set of n integers and value of k, the main program creates k child processes, assigns each child process to compute the total of its assigned ceiling of n/k numbers, waits for the sub-total from each of the k child processes, sum up the sub-totals, and print the result of each sub-total as well as the overall total. I have not use threads.
This program is created for assignment in the college and they it is expected to run in any department computer.
This code correctly compile on Kali Linux but I can not compile and run on other Linux versions. When I tried to compile on Ubuntu it gives the error saying
undefined reference to 'sem_init'
I used -lrt in the line of compiling. Please help me with this problem.
This is the code that I created.
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<semaphore.h>
#include<unistd.h>
#include<math.h>
#include<stdlib.h>
#define BUFFER_SIZE 100
#define BUFFER_SUB 2
typedef struct
{
int bufMax;
int datalimit;
int buff[BUFFER_SIZE];
sem_t mutex, empty, full;
} shared_inputs;
typedef struct
{
int sub[BUFFER_SUB];
sem_t mutex,empty,full;
}sub_tot;
int main(int argc, char *argv[])
{
int x = 0;
int data,count,i,j,tot;
int n;
int k =atoi(argv[2]);
int assign_size;
count = tot =0;
int segment_id;
size_t segment_size = sizeof(shared_inputs);
segment_id = shmget(IPC_PRIVATE,segment_size,IPC_CREAT|0666);
shared_inputs *shared_memory = shmat(segment_id,NULL,0);
sem_init(&shared_memory->mutex,1,1);
sem_init(&shared_memory->empty,1,BUFFER_SIZE);
sem_init(&shared_memory->full,1,0);
int segment_idSubs;
size_t segment_size1 = sizeof(sub_tot);
segment_idSubs = shmget(IPC_PRIVATE,segment_size1,IPC_CREAT|0666);
sub_tot *subtotal = shmat(segment_idSubs,NULL,0);
sem_init(&subtotal->mutex,1,1);
sem_init(&subtotal->empty,1,BUFFER_SUB);
sem_init(&subtotal->full,1,0);
FILE *numFile;
numFile = fopen(argv[1], "r");
while(!feof(numFile))
{
fscanf(numFile,"%d",&data);
sem_wait(&shared_memory->empty);
sem_wait(&shared_memory->mutex);
shared_memory->buff[x] = data;
sem_post(&shared_memory->mutex);
sem_post(&shared_memory->full);
printf("%d ", shared_memory->buff[x]);
x++;
n = x;
}
assign_size = ceil((double)n/(double)k);
printf("\n");
shared_memory->datalimit = 0;
shared_memory->bufMax = n-1;
printf("assigned size : %d \n", assign_size);
printf("n : %d , k : %d \n",n,k);
for(i =0; i < k; i++)
{
int id;
int subt = 0;
id = fork();
if(id < 0) // error in fork
{
perror("Error in fork ");
exit(300);
}
else if(id == 0)//the new child process
{
for(j=0;j< assign_size; j++)//getting items from the shared memory
{
sem_wait(&shared_memory->full);
sem_wait(&shared_memory->mutex);
int num = shared_memory->buff[shared_memory->datalimit];
//printf("%d \n",shared_memory->buff[shared_memory->datalimit]);
shared_memory->datalimit++;
sem_post(&shared_memory->mutex);
sem_post(&shared_memory->empty);
subt = subt + num;
if(shared_memory->datalimit == shared_memory->bufMax)
{
break;
}
}
int pid = getpid();
sem_wait(&subtotal->empty);
sem_wait(&subtotal->mutex);
subtotal->sub[0] = pid;
subtotal->sub[1] = subt;
sem_post(&subtotal->mutex);
sem_post(&subtotal->full);
printf("Sub-total produced by Processor with ID %d: %d \n",pid,subt);
exit(0);
}
else//parent process
{
int status;
wait(&status);
sem_wait(&subtotal->full);
sem_wait(&subtotal->mutex);
int sub = subtotal->sub[1];
sem_post(&subtotal->mutex);
sem_post(&subtotal->empty);
tot = tot+sub;
}
}
printf("Total: %d \n",tot);
return 0;
}
Upvotes: 2
Views: 13442