Taśma produkcyjna w jęzuku C

0

Mam do napisania taki program na programowanie równolegle i rozproszone w języku c . Taśma produkcyjna: Program wieloprocesowy oblicza współbieżnie wartości wielomianu metodą Hornera Pn(x) = x ( x ( x ( ... x ( x (an) + an-1 ) + an-2 ) + an-3 ) + . . . + a1 ) +a0 np. P3(x) = x (x (x*a3 + a2 ) + a1 ) + a0 = a3 x3 + a2 x2 + a1 x + a0 Proces P0 dostaje współczynniki wielomianu jako parametry funkcji main( int arg, char **av). Następnie P0 generuje proces potomny P1 , P1 generuje P2 itd. Procesy pobierają odpowiedni współczynnik wielomianu z argumentu funkcji main ( lub inna możliwosć proces P0 wysyła im współczynniki ) . Proces P0 pobiera wartość argumentu x z wejścia i wysyła je do procesów. Obliczenia zaczyna ostatni proces Pn-1 ( x + an-1 ) , a wynik przesyła do Pn-2 itd. Ostateczny wynik otrzymuje proces P0 i wypisuje go na ekranie. Procesy komunikują się poprzez potoki anonimowe. Ktoś pomoże lub napisze ?

0

A w czym jest problem?

0

Mam juz tyle napisane probkem jest w tym, że nie wiem jak utowrzyc proces macierzysty i procesy potomne kotre beda obliczac metoda hornera

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>

FILE *plik;
int wielomian[1000];
int a[20];
int ilosc,iloscprocesow=0,i,j,stopien=3;
 main(int ar, char **av)
{
int  ch=getpid();
int des[2],czytanie;
   
   if((plik=fopen("dane","r"))==NULL)
   {
       printf("Blad otwarcia pliku / Pusty plik\n");
   }
   
   while(feof(plik)==0)
   {
        fscanf(plik,"%d",&wielomian[ilosc]);
        ilosc++;
   }

fclose(plik);


printf("Podaj stopien wielomianu \n");
scanf("%d",&stopien);
for(j=0;j<stopien;j++)
{
 printf("Pdaj wspolczynik a dla [%d] stopnia wielomianu\n",j);

for (i=0;i<ilosc;i++)
{
printf("W(%d) =\n",wielomian[i]);
}

 pipe(des);
for(i=0;i<stopien;i++)
{
if(fork())
break;
czytanie=des[0];
close (des[1]);
pipe (des);
iloscprocesow++;

}
}
close(des[0]);
 if(i==stopien)
 {setpgrp();
  getchar();
}

while(1)
{
  if(iloscprocesow==0)
   printf("B;ad pliku / ERROR \n");
  else

}
printf("potemk id=%d rodzic id =%d\n",getpid(),getppid());
fflush(stdout);
pause();

}
0

Macierzysty - main() już masz. Potomne - fork(), czyli też już masz. Więc jeszcze raz, w czym jest problem?

0

Tego mi brakuje Proces P0 pobiera wartość argumentu x z wejścia i wysyła je do procesów. Obliczenia zaczyna ostatni proces Pn-1 ( x + an-1 ) , a wynik przesyła do Pn-2 itd. Ostateczny wynik otrzymuje proces P0 i wypisuje go na ekranie. Czyli kazdy proces musi wyslac odbierac i wyslac argumenty

0

Mam już tyle ale nic nie wysiwetla nic nie liczy i nie wiem gdzie jest problem
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
FILE *plik;
int wielomian[1000];
int a[20];
int ilosc,iloscprocesow=0,i,j,stopien;
main(int ar, char **av)
{
int ch=getpid();
int des[2],czytanie;
int wynik;
if((plik=fopen("dane","r"))==NULL)
{
printf("Blad otwarcia pliku / Pusty plik\n");
}
while(feof(plik)==0)
{
fscanf(plik,"%d",&wielomian[ilosc]);
ilosc++;
}
fclose(plik);
printf("Podaj stopien wielomianu \n");
scanf("%d",&stopien);
//for(j=0;j<stopien;j++)
//{
// printf("Pdaj wspolczynik a dla [%d] stopnia wielomianu\n",j);
//scanf("%d",&a[j]);
//}
for (i=0;i<ilosc;i++)
{
printf("W(%d) =\n",wielomian[i]);
}
pipe(des);
for(i=0;i<stopien;i++)
{
if(fork())
break;
czytanie=des[0];
close (des[1]);
pipe (des);
iloscprocesow++;
} close(des[0]);
//dzialanie for(i=0;i<stopien;i++)
{
wynik=wielomian[i]+wielomian[i];
write(des[1],&wynik,sizeof(wynik)); // zapis do potoku
//flush(stdout);
}
close(des[1]);
exit(0);
// proces macierzysty
if (wynik)
{
int rzut;
close(des[1]); // zamyka koncowke do pisania
read(des[0],&rzut ,sizeof(rzut)); // czyta z potoku
printf("\todbieram : %d \n",rzut );
close(des[0]);
wait(0);
if(i==stopien)
{
setpgrp();
getchar();
}
printf("potemk id=%d rodzic id =%d\n",getpid(),getppid());
fflush(stdout);
pause();
}
}

0

Mógłby mi ktoś pomoc mam napisany cały już program tylko procesy potomne nie przekazują dane do obliczenia przez strukture . A komunikacja miedzy nimi dziala

#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 
#include<sys/wait.h> 
#include<unistd.h>


FILE *plik; 
int a[20];
float y,x;
int flaga;
int iloscprocesow=0,i,j,stopien; 
main(int ar, char **av) 

{ 

 struct dane {
  float x,y;
  int flaga;
};
int ch=getpid(); 
int des[2],czytanie;  

 printf("\nPodaj stopien wielomianu \n"); 
scanf("%d",&stopien); 
for(j=0;j<stopien;j++)
{ 
printf("Pdaj wspolczynik a dla [%d] stopnia wielomianu\n",j); 
scanf("%d",&a[j]); 
} 


pipe(des); 

for(i=0;i<stopien;i++) 
{ 
  
  
if(fork()) 
break; 
czytanie=des[0]; 
close (des[1]); 
pipe (des); 
iloscprocesow++; 
} 

close(des[0]); 



if (iloscprocesow==0) {
 struct dane d={0,0,1};
 printf("\nARGUMENTTY DO OBLICZENIA :\n");
if((plik=fopen("dane","r"))==NULL) 
{ 
printf("Blad otwarcia pliku / Pusty plik\n");
} 
 while (fscanf(plik,"%f",&x)==1) 
{ 

d.x=x;
d.y=y;
d.flaga=flaga;

  printf("(%.2f),",x," ");
write (des[1],&d ,sizeof(d));
 
  }

 d.flaga=0;
write (des[1],&d,sizeof(d));




}

if (iloscprocesow>0  ) {
   //struct dane d={0,0,1};

  while (read (czytanie,&d,sizeof(d))>0) {
 
 //if (d.flaga==0) { exit(0);}
 if (iloscprocesow==stopien) printf("\nWynik wielomianu=(%.2f) \n",y);
 else
 {   
 y=a[0];

for(i=0;i<stopien+1;i++)
{
y=y*x+a[i];
}  
 write (des[1],&y,sizeof(y)); 
   
}

                                   }
                                
}







//printf("%d numer %d\n",getpid(),iloscprocesow); 
fflush(stdout); 
pause(); 
fclose(plik);

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1