Здравствуйте, пишу в блокноте, возникает такая проблема, после записи данных в пайпы и окончании процессов, при считывании данные в них обнулены. Подскажите, кто знает, может вообще с пайпами не возможно так сделать.
Суть кода: Запуск программы, программа запускает потомственные процессы и организует пайпы, те в свою очередь делают вычисления и записывают данные в назначенные им пайпы, затем родитель считывает данные из пайпов и выводит результат.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
float func(float x){return exp((-1)*x*x*log(exp(1)));};
int main(){
const int SIZE = 2;
pid_t pid=getpid();//[SIZE];
int p[SIZE][2], status;
float *buffer;
float dx,a,b,h;
a=1; b=3; h=20;
dx=(b-a)/h;
printf(" a=%f, b=%f, dx=%f\n",a,b,dx);
printf("main program start\n");
for(int i=0; i<SIZE; i++){
if (pid>0)
{
buffer=new float;
*buffer=0;
printf("starting process №%d\n", i);
printf("set pipe to %d, return %d\n",i,pipe(p[i]));
printf(" write p[%d] (parent) return %d\n",i,write(p[i][1],buffer,sizeof(*buffer)));
pid=fork();
}
if (pid==0){
float sum,x;
float *buff=new float;
x=a+dx*(i+1);
sum=0;
while(x<b){
sum+=func(x);
printf("process №%d sum=%f on x=%f\n",i,sum,x);
x+=SIZE*dx;
}
*buff=sum;
printf(" sum - %f\n", *buff);
printf(" write p[%d] (child) return %d\n",i,write(p[i][1],buff,sizeof(*buff)));
exit(0);
}
}
wait(&status);
printf("main cycle\n");
float ans=func(a)/2+func(b)/2;
printf("start ans - %f\n",ans);
for (int i=0; i<SIZE; i++){
//printf("set pipe to %d, return %d\n",i,pipe(p[i]));
printf(" close p[%d] (parent) return %d\n",i,close(p[i][1]));
printf(" read p[%d] (parent) return %d\n",i,read(p[i][0],buffer,sizeof(*buffer)));
printf("collect slot №%d, f - %f\n", i, *buffer);
ans+=*buffer;
}
printf("end ans\n");
printf(" Answer is %f. Check answer is 0.13938\n",ans*dx);
printf("end main\n");
exit(0);
}
Выполнение:
Код:
~/work> g++ -o integral -lm integral.cpp && ./integral
a=1.000000, b=3.000000, dx=0.100000
main program start
starting process №0
set pipe to 0, return 0
write p[0] (parent) return 4
starting process №1
set pipe to 1, return 0
write p[1] (parent) return 4
process №1 sum=0.236928 on x=1.200000
process №0 sum=0.298197 on x=1.100000
process №1 sum=0.377786 on x=1.400000
process №0 sum=0.482717 on x=1.300000
process №1 sum=0.455091 on x=1.600000
process №0 sum=0.588116 on x=1.500000
process №1 sum=0.494255 on x=1.800000
process №0 sum=0.643692 on x=1.700000
process №1 sum=0.512570 on x=2.000000
process №0 sum=0.670744 on x=1.900000
process №1 sum=0.520477 on x=2.200000
process №0 sum=0.682899 on x=2.100000
process №1 sum=0.523628 on x=2.400000
process №0 sum=0.687941 on x=2.300000
process №1 sum=0.524788 on x=2.600000
process №0 sum=0.689871 on x=2.500000
process №1 sum=0.525181 on x=2.800000
process №0 sum=0.690554 on x=2.700000
sum - 0.525181
process №0 sum=0.690776 on x=2.900000
sum - 0.690776
write p[1] (child) return 4
write p[0] (child) return 4
main cycle
start ans - 0.184001
close p[0] (parent) return 0
read p[0] (parent) return 4
collect slot №0, f - 0.000000
close p[1] (parent) return 0
read p[1] (parent) return 4
collect slot №1, f - 0.000000
end ans
Answer is 0.018400. Check answer is 0.13938
end main