🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #6748

programacion paralela -fork &pipes - novato (mensaje largo)

#6748
From: m. sx
Date: Thu, 22 May 2003 19:46
151 lines
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-mail

Show 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; )