Thnx Salem... sorry because I didn't paste my code... here it is now... I fixed the code and now I had just a little bit problem more and that is that my parent dont wait allways for all sons... sometimes finished early then other child proces...
I apologies because the comments are in our language...
Code:
int main(int argc, char** argv)
{
if(argc<2)
{
printf("Premalo st argumentov\n");
return -1;
}
int Pipe[2];
int Pipe1[2];
int Pipe2[2];
int pid;
int i=0;
if(pipe(Pipe) == -1) //odpremo prvo pipo ter dobimo dva oprimka
{
perror("pipe call error"); //ce ne uspe izpisemo napako vrnemo OS-u 1
_exit(1);
}
if(pipe(Pipe1) == -1) //odpremo drugo pipo ter dobimo dva oprimka
{
perror("pipe call error"); //ce ne uspe izpisemo napako vrnemo OS-u 1
_exit(1);
}
if(pipe(Pipe2) == -1) //odpremo tretjo pipo ter dobimo dva oprimka
{
perror("pipe call error"); //ce ne uspe izpisemo napako vrnemo OS-u 1
_exit(1);
}
int k=1;
for(; k<=argc; k++) //koliko je argumentov toliko krat posljemo vrednost s plavajoco vejico
{
for(i=0; i<4; i++)
{
if((pid=fork())==0) //ustavrjanje sinov
break;
}
if(pid==0) //ce je sin
{
switch(i) //preklapljamo med i
{
//proizvajalec
case 0 :
{
close(Pipe[0]); //zapremo del za branje iz prve pipe
float *num=(float*)malloc(sizeof(float)); //dinamicno dodeljevanje pomnilnika
*num=atof(argv[k]); //priredimo vrednost k-tega argumenta spremenljivki num
write(Pipe[1],(char*)num,sizeof(float)); //posljemo distributerju
close(Pipe[1]); //zapremo prvo pipo za pisanje ker je ne potrebujemo vec
free(num); //sprostimo pomnilnik
exit(0);
break;
}
//distributer
case 1 :
{
close(Pipe[1]);
float *num1=(float*) malloc(sizeof(float)); //dinamicno dodeljevanje pomnilnika
read(Pipe[0],num1,sizeof(float)); //preberemo iz prve pipe
*num1 = *num1 + ((*num1 / 100) * 30); //povecamo prebrano stevilo za 30%
write(Pipe1[1],(char*)num1,sizeof(float)); //posljemo trgovcu
free(num1); //sprostimo dinamicno dodeljen pomnilnik
close(Pipe[0]); //zapremo prvo pipo za branje
exit(0);
break;
}
//trgovec
case 2 :
{
close(Pipe1[1]); //zapremo drugo pipo za pisanje ker je tu ne potrebujemo
float *num2 = (float*) malloc(sizeof(float)); //dinamicnco alociramo prostor
read(Pipe1[0],num2,sizeof(float)); //prebremo iz druge pipe
*num2 = *num2 + ((*num2 / 100) * 35); //povecamo prebrano stevilo za 35%
write(Pipe2[1],(char*)num2,sizeof(float)); //posljemo potrosniku
free(num2); //sprostimo dinamicno dodeljen pomnilnik
close(Pipe1[0]); //zapremo drugo pipo za branje
exit(0);
}
//potrosnik
case 3 :
{
close(Pipe2[1]); //zapremo tretjo pipo za pisanje
float *num3 = (float*) malloc(sizeof(float)); //dinamicno rezerviramo prostor
read(Pipe2[0],num3,sizeof(float)); //preberemo iz tretje pipe
printf("%f\n",*num3); //in prebrano vrednost izpisemo na zaslon
free(num3); //sprostimo dinamicno alociran pomnilnik
close(Pipe2[0]); //zapremo tretjo pipo za branje
exit(0);
}
}
}
}
}