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 ?
A w czym jest problem?
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();
}
Macierzysty - main()
już masz. Potomne - fork()
, czyli też już masz. Więc jeszcze raz, w czym jest problem?
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
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();
}
}
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);
}