Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2011, 19:28   #1
Lomik_XP
Новичок
Джуниор
 
Регистрация: 08.10.2011
Сообщений: 2
Сообщение Вопрос по pipes (c++) в Linux

Здравствуйте, пишу в блокноте, возникает такая проблема, после записи данных в пайпы и окончании процессов, при считывании данные в них обнулены. Подскажите, кто знает, может вообще с пайпами не возможно так сделать.
Суть кода: Запуск программы, программа запускает потомственные процессы и организует пайпы, те в свою очередь делают вычисления и записывают данные в назначенные им пайпы, затем родитель считывает данные из пайпов и выводит результат.
Код:
#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

Последний раз редактировалось Lomik_XP; 08.10.2011 в 19:40.
Lomik_XP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Named pipes, парсинг строки Alex217Vish Visual C++ 0 04.11.2010 22:29
named pipes st01en Общие вопросы Delphi 1 26.09.2010 23:33
Linux на VMware....... WinXP <-> Linux DMUTPUU Операционные системы общие вопросы 1 24.09.2008 12:03
Вопрос по Linux/Kylix Elm0 Свободное общение 5 10.03.2008 16:06