Me han planteado el siguiente problema. Yo no tengo demasiada idea de Unix, pero me han perdido el favor de intentar resolverlo.
Consiste en un ejercicio para la utilizacion de pipes. El proceso Hijo tiene que pensar un número aleatorio, y el padre tiene que adivinarlo en menos de 100 intentos.
El proceso sería:
Padre piensa numero, se lo envia al hijo, hijo comprueba ese numero con el suyo, hijo manda al padre la comprobacion, en forma de "tiene que ser mayor" o "tiene que ser mayor", el padre con esa informacion genera otro numero y vuelta a empezar.
El problema es q no se como hacer bucles entrando y saliendo del hijo.
Tengo el siguiente código:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
int status;
int nread;
int numeroHijo, numeroPadreMin, numeroPadreMax,numeroPadre, i,intentoPadre, menorMayor;
char buffer[100], bufferHijo[100];
char msgPadre[100];
//Generamos el numero aleatorio objetivo
srandom(getpid());
numeroHijo=(int)(256*random()/RAND_MAX);
//Creamos las Pipes
int pipePadreHijo[2];
int pipeHijoPadre[2];
/* Creacion de la pipePadreHijo */
if(pipe(pipePadreHijo) == -1)
perror("pipe");
/* Creacion de la pipeHijoPadre */
if(pipe(pipeHijoPadre) == -1)
perror("pipe");
// Creacion de un proceso hijo
switch(fork())
{
case -1:
perror("fork");
exit(EXIT_FAILURE);
case 0:
// Cerramos la entrada del Hijo en la pipePadreHijo
if(close(pipePadreHijo[1]) == -1)
perror("close");
// Cerramos la salida del Hijo en la pipeHijoPadre
if(close(pipeHijoPadre[0]) == -1)
perror("close");
// Lectura de la información contenida en la pipe.
switch(nread = read(pipePadreHijo[0],bufferHijo,sizeof(bufferHijo)))
{
case -1:
perror("read");
break;
case 0:
perror("EOF");
break;
default:
intentoPadre=atoi(bufferHijo);
if (intentoPadre< numeroHijo)
{
if(write(pipeHijoPadre[1],"1",1) == -1)
perror("write");
}
if (intentoPadre> numeroHijo)
{
if(write(pipeHijoPadre[1],"2",1) == -1)
perror("write");
}
printf("Mi padre ha dicho %s y yo he pensado %d \n",bufferHijo,numeroHijo);
}
exit(EXIT_SUCCESS);
}
// Cerramos la salida del Padre en la pipePadreHijo
if(close(pipePadreHijo[0]) == -1)
perror("close");
// Cerramos la entrada del Padre en la pipeHijoPadre
if(close(pipeHijoPadre[1]) == -1)
perror("close");
//El padre genera un numero aleatorio
numeroPadre=(int)(256*random()/RAND_MAX);
sprintf(msgPadre,"%d",numeroPadre);
/* El proceso Padre escribe en la pipe */
if(write(pipePadreHijo[1],msgPadre,sizeof(msgPadre)) == -1)
perror("write");
switch(nread = read(pipeHijoPadre[0],buffer,sizeof(buffer)))
{
case -1:
perror("read");
break;
case 0:
perror("EOF");
break;
default:
menorMayor = atoi(buffer);
if(menorMayor == 1)
{
printf("Mi hijo dice que el numero tiene que ser mayor\n");
numeroPadreMin = numeroPadre;
}
else if(menorMayor == 2)
{
printf("Mi hijo dice que el numero tiene que ser menor\n");
numeroPadreMax = numeroPadre;
}
else
{
printf("Numero encontrado!\n");
}
}
wait(&status);
exit(EXIT_SUCCESS);
}
¿Alguna idea? Tener en cuenta que no tengo ni idea de Unix, llevo un rato aprendiendo que es esto de padres e hijos