es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El proceso padre no puede leer() desde STDIN después de la bifurcación (fork()).

Quiero probar un programa de señales de CSAPP (Computer System A Programmer’s Perspective) en mi servidor Ubuntu 16.04. Aquí está el código.

Pero no puedo leer nada desde la entrada estándar después del bucle fork().

La afirmación ‘Parent processing input’ nunca se imprime, por lo que creo que el programador se bloquea en read().

El código está en inglés y contiene algunos caracteres especiales que no pueden ser traducidos directamente sin afectar su funcionalidad.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece ser que el problema está siendo causado por la función read() bloqueando la ejecución del programa. Esto sucede porque la función read() espera por la entrada del flujo de entrada estándar (stdin) y no retorna hasta recibir la entrada.

    Una forma de solucionar este problema es utilizando una lectura de entrada no bloqueante. Podemos hacer esto configurando el indicador O_NONBLOCK en el descriptor del archivo asociado con stdin. De esta forma, cuando se llama a la función read(), no se bloquerá, sino que retornará inmediatamente si no hay entrada disponible.

    Para configurar el indicador O_NONBLOCK, podemos utilizar la función fcntl() de la siguiente manera:

    #include <fcntl.h>
    
    int flags = fcntl(STDIN_FILENO, F_GETFL, 0);
    flags |= O_NONBLOCK;
    fcntl(STDIN_FILENO, F_SETFL, flags);
    

    Debemos añadir este código antes del comando read() en la función main(). Esto nos permitirá leer la entrada desde el flujo de entrada estándar sin bloquear la ejecución del programa.</fcntl.h>

Comments are closed.