You are on page 1of 2

#include<stdio.

h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
#define max 128

int main(int argc,char *argv[]){


FILE *mipipe;
char buffer[max];
mode_t fifo_mode=S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
int procesos,N_pro,N_fac;
int ID,hijo_padre[2];

if(mkfifo("tuberia",fifo_mode)==0){
printf("No se puede crear la tuberia con nombre");
}
mipipe=fopen("tuberia","r");
fscanf(mipipe,"%d %d %d",&procesos,&N_fac,&N_pro);
//printf("%d %d %d \n",procesos,N_fac,N_pro);
fclose(mipipe);

long int fac,TOTAL=1;


if(N_fac<2){ //Revisa si el factorial es menor a 2 en ese caso solo da 1
printf("El resultado es: 1\n");
}else{
int status,i,x,y,prod;

for(i=0,x=2;i<N_pro;++i){

if(pipe(hijo_padre)==-1){
printf("Error al crear tuberia sin nombre\n");
}
ID=fork();

switch(ID){
case -1:
printf("No se pudo crear un hijo"); //Caso de error
exit(0);
case 0:
fac=1;

FILE *escritura=fdopen(hijo_padre[1],"w"); //El hijo


escribe en el pipe y el padre podra leerlo

printf("EL PROCESO HIJO CON PID %d CALCULO EL


PRODUCTO DE ",getpid());
if(i==(N_pro-1)){//Si el proceso es el ultimo en
ejecutar entonces este debe terminar todas las demas multiplicaciones
for (;x<=N_fac;++x){ //realiza las
multiplicaciones restantes
fac=fac*x; //realiza el factorial
printf("%d,",x); //lanza a pantalla el
mensaje
fprintf(escritura, "%d,",x); //Escribe en
el archivo
}
}
else{ //Es un proceso intermedio
for(y=0;y<procesos;++y){
printf("%d,",x);
fac=fac*x; //realiza el factorial
fprintf(escritura, "%d,",x); //escribe en
el archivo
++x;//incrementa x
}
}
printf(" Y RETORNO %ld\n",fac);
fprintf(escritura, " %d %ld
%ld",x,fac,TOTAL*fac); //Termina de escribir en el archivo
//los datos necesarios para la siguiente iteracion
del padre.
fclose(escritura);
exit(0); //termina la ejecucion del hijo para que
este no genere mas hijos
default:
wait(&status);
close(hijo_padre[1]);
FILE *lectura=fdopen(hijo_padre[0],"r");
//---------------------------------------------------
---------------
printf("HIJO %d CON PID %d CALCULO EL PRODUCTO DE
",i,ID);
if(i==(N_pro-1)){ //Se verifica si es el ultimo
proceso a realizar
for(;x<=N_fac;++x){
printf("%d,",x);
fscanf(lectura," %d,",&prod); //se lee
del archivo los datos
}
}
else{
for(int i=0;i<procesos;++i){
fscanf(lectura," %d,",&prod);
printf("%d,",prod);
}
}
fscanf(lectura,"%d %ld %ld",&x,&fac,&TOTAL); //Se
obtienen los datos para la siguiente iteracion
printf(" Y RETORNO %ld\n\n",fac);
//printf("Fin\n");
fclose(lectura);

}
}
}

printf("El resultado es: %ld\n",TOTAL);

return 0;
}