Article View: es.comp.os.linux.programacion
Article #6748programacion paralela -fork &pipes - novato (mensaje largo)
From: m. sx
Date: Thu, 22 May 2003 19:46
Date: Thu, 22 May 2003 19:46
151 lines
4056 bytes
4056 bytes
Estoy haciendo un programa que suma los n�meros del 1 al n
(n=12 por ejemplo) es decir 1+2+3....+12, pero quiero que se haga en forma
paralela de la siguiente forma:
Quiero dividir lo que hay que sumar y que cada semisuma sea realizada por
un proceso distinto para ello uso la funcion fork())
(esto es lo que sumar�a cada proceso hijo)
PROCESO HIJO 1: 1+2+3+4= 10
PROCESO HIJO 2: 5+6+7+8= 26
PROCESO HIJO 3: 9+10+11+12= 42
Ahora, cada hijo le debe enviar al padre el subtotal, para ello utilizo pipe(),
y para finalizar quiero que el padre sume lo enviado por los procesos
hijo (total=78) y lo imprima.
Pero por alguna raz�n s�lo el primer proceso hijo devuelve la cantidad
a sumar (subtotal =10) al padre, el resto no lo hacen.
Estare implementando mal la tuberias(pipe()?no le encuentro el error!!
Ya llevo varios dias con esto y no lo he podido resolver es por eso que
recurro a uds.
Alguna idea de que estoy haciendo mal??.
Saludos
Marcelo
Ac� va el prog para que le echen un vistazo y critiquen ya que soy novato
programando (es casi con seguridad que debo tener algunos problemas
conceptuales tambi�n).
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#define SIZE 12
#define NPROCS 3
int inicio_subproc(int *);
int num_data = SIZE/NPROCS;
int main(void)
{
int a[SIZE], i, e, iop [NPROCS], fd[2], *ap, status, tot=0;
pid_t subpid;
/*inicializo el arreglo*/
for (i=0;i<NPROCS;i++)
iop[i]=0;
/*creo la tuberia para pasar los subtotales*/
if( pipe (fd)== -1)
{
perror("Error al crear pipe");
exit(1);
}
/*esto es lo que hay que sumar*/
for (i = 1 ; i <= (SIZE) ; i++)
a[i] = i % (SIZE+1);
/*loop para cada subproceso*/
for(e = 0 ; e < NPROCS; e++)
{
ap=(int *) malloc (num_data*sizeof(int));
/*tengo que mover el puntero para cada proceso sume una parte*/
ap=&a[num_data*e];
if((subpid = fork())== -1){
perror("fork");
exit(EXIT_FAILURE);
}else if (subpid ==0){
iop[e]=inicio_subproc(ap);
/* cierro input del pipe */
close(fd[0]);
/* envio subtotal por el pipe */
write(fd[1],&iop[e], sizeof(iop));
printf("subtotal(%d)=%d\n",e,iop[e]);
exit(EXIT_SUCCESS);
} else {
/* ESPERAMOS A QUE LOS HIJO TERMINEN */
waitpid(subpid,&status,0);
close(fd[1]);
/* leo subtotal desde el pipe */
read(fd[0], &iop[e], sizeof(iop));
}
/* VOY SUMANDO LO ENVIADO PARA SACAR EL TOTAL */
tot+=iop[e];
}
/* IMPRIMO EL TOTAL */
printf("Total(recibido/acumulado): %d\n", tot);
}
int inicio_subproc (int *ap)
{
int i, sum = 0;
/* lo debe realizar cada proceso*/
for(i = 1;i <=num_data ; i++ )
sum+=ap[i];
return sum;
}
Technical Details
Message-ID:
<20030522164611.50bd233a.kuntx@kx99.hn.org>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed.freenet.de!news.tu-darmstadt.de!fu-berlin.de!uni-berlin.de!168-226-34-138.speedy.com.AR!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,9aa1fdc2d1bcdcfc,start X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2003-05-22 12:34:11 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed.freenet.de!news.tu-darmstadt.de!fu-berlin.de!uni-berlin.de!168-226-34-138.speedy.com.AR!not-for-mail From: "m. sx" <kuntx@kx99.hn.org> Newsgroups: es.comp.os.linux.programacion Subject: programacion paralela -fork &pipes - novato (mensaje largo) Date: Thu, 22 May 2003 16:46:11 -0300 Lines: 157 Message-ID: <20030522164611.50bd233a.kuntx@kx99.hn.org> NNTP-Posting-Host: 168-226-34-138.speedy.com.ar (168.226.34.138) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: fu-berlin.de 1053632049 369990 168.226.34.138 (16 [96923]) X-Newsreader: Sylpheed version 0.8.3claws (GTK+ 1.2.10; )