• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1220
  • Last Modified:

matrix addition using shared memory

I want to add 2 matrices using shared memory and parallel processes, in linux, but my code doesnt run correctly .
Where is the problem?
#include <stdio.h>

#include <sys/shm.h>

#include <sys/stat.h>

#include <stdlib.h>



int main ()

{



int idA,idB,idC, child_id;

int *A,*B, *C;//the 3 arrays

int* child_memory;

int *pA, *pB, *pC;

const int size = 4096;

int i;

//allocate shared memory for an array of 5 integers

idA = shmget(IPC_PRIVATE, 5*sizeof(int), S_IRUSR | S_IWUSR);

idB = shmget(IPC_PRIVATE, 5*sizeof(int), S_IRUSR | S_IWUSR);

idC = shmget(IPC_PRIVATE, 5*sizeof(int), S_IRUSR | S_IWUSR);



//attach shared memory to parent

A = (int *) shmat(idA, NULL, 0);

B = (int *) shmat(idB, NULL, 0);

C = (int *) shmat(idC, NULL, 0);

for(i=0; i<5; i++){

         A[i]=1;

         B[i]=2;

         C[i]=0;

         }

for (i=0; i<5; i++){

    printf("A[%d]=%d B[%d]=%d  C[%d]=%d\n",i,A[i],i,B[i],i,C[i]);

}

printf("\n"); 

for(i=0;i<5; i++){

   child_id=fork();

   if (child_id==0){

       A = (int*) shmat(idA, NULL, 0);

       B = (int*) shmat(idB, NULL, 0);

       C = (int*) shmat(idC, NULL, 0);             

       C[i] = A[i] + B[i];

       

   }

   else if (child_id>0){

    wait(0);

        

   }

   else {perror("fork");exit(1);}

}   

printf("C[%d] = %d ", i,C[i]);       



shmdt(A);shmdt(B);shmdt(C);



shmctl(idA, IPC_RMID, NULL);

shmctl(idB, IPC_RMID, NULL);

shmctl(idC, IPC_RMID, NULL);

return 0;

}

Open in new window

0
dimi67
Asked:
dimi67
  • 2
  • 2
1 Solution
 
Infinity08Commented:
Could you elaborate a bit on how it doesn't run correctly ? What do you observe ? What did you expect instead ?
0
 
dimi67Author Commented:
.if you run the code you will see that t values of array C don't change at all...
0
 
Infinity08Commented:
>> printf("C[%d] = %d ", i,C[ i]);  

At this point, i = 5. That'll show an out-of-range value from the array. You probably intended to put this in a loop for i from 0 to 4.

You probably also want to end the children (ie. exit) once they've done their job.

And you probably also want to let the parent wait until the children have done their job.
0
 
dimi67Author Commented:
ok men, I fixed it with exit(0) at the end of the child...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now