Unix C Bucle entre procesos padre e hijo

Hynack

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

Hynack

Por cierto que este codigo funciona, pero solo lo hace una vez, logicamente.

MTX_Anubis

La ultima vez que toqué esto fue hace unos años así que te no puedo escribir el código pero deberías hacer algo así:

  • Comprueba en el fork si es padre o hijo
    -- Si es padre
    ---- 1. Le envío un número aleatorio al hijo
    ---- 2. Espero respuesta del hijo
    ---- 3. ¿Acierto? Termino. ¿Fallo? De vuelva al número 1
    -- Si es hijo
    ---- 1. Genero un número aleatorio
    ---- 2. Espero al número de mi padre
    ---- 3. Le envío al padre si ha acertado o no. Si acierta termino, si no, de vuelta a número 2.

Te falta la comprobación del padre e hijo (o estoy muy ciego o solo haces la comprobación del hijo con lo que el resto del código de después lo ejecutarán ambos) y meterlo en un while hasta que acierte o haga 100 iteraciones.

1 respuesta
Hynack

¿Como puedo esperar a la respuesta del padre o hijo?

1 respuesta
Lecherito

#4 Semaforos

1 respuesta
Hynack

#3 #5 gracias. Mañana os digo como ha quedado la cosa, pero creo que lo tengo bastante encarrilado.

Usuarios habituales

  • Hynack
  • Lecherito
  • MTX_Anubis