PDA

View Full Version : سوال: استفاده از semaphore



feri_sharp
شنبه 02 دی 1391, 21:08 عصر
سلام دوستان.
توی برنامه ی زیر، کجا از semaphore میشه استفاده کرد که نتیجه ی محاسبه ی انتگرال رو درست چاپ کنه.
من این برنامه رو تا اینجا نوشتم. اما هر پروسه ای که با fork ایجاد شده هر وقت بخواد به share memory دسترسی داره و مقدارشو تغییر میده قبل از اینکه پروسه ی پدر مقدار رو بخونه.
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<semaphore.h>

int area(int a,int b,int H) {return (((a*a)+(b*b))*H)/2;}
sem_t sem;
main()
{
int *value;
pid_t pid;
int i;
int status;
int result=0;
int pids[10];
int shmid;
key_t key;
key=ftok("prog.c",0);
shmid=shmget(key,1024,0644|IPC_CREAT);
value=shmat(shmid,(void *)0,0);
if(value==(int *)(-1))
perror("shmat");
if(sem_init(&sem,0,0)==-1)
perror("Semaphore initialize failed");
for(i=0;i<=9;i++)
{

pid=fork();
if(pid==0)
{

*value=area(i,i+1,1);
printf("I'm child: %d -> Value: %d\n",i,*value);
exit (EXIT_SUCCESS);
}
else if(pid>=1) pids[i]=pid;
}
for(i=0;i<=9;i++)
{
wait(&status);
if(WIFEXITED(status))
{
if(pids[i]>=1)
{
result+=*value;
printf("I'm Parent: %d -> Value Returned: %d\n",i,*value);
}
}
}
printf("result : %d\n",result);
shmdt(value);
}

ممنون
موفق باشید.

feri_sharp
یک شنبه 03 دی 1391, 15:46 عصر
دوستان کسی نظری نداره؟