Lectura de la tubería STDIN cuando se usa proc_open

Estoy tratando de hacer un sitio web donde las personas puedan compilar y ejecutar su código en línea, por lo que necesitamos encontrar una forma interactiva para que los usuarios envíen instrucciones.

En realidad, lo primero que viene a la mente esexec() osystem(), pero cuando los usuarios quieren ingresar algo, de esta manera no funcionará. Así que tenemos que usarproc_open().

Por ejemplo, el siguiente código

int main()
{
    int a;
    printf("please input a integer\n");
    scanf("%d", &a);
    printf("Hello World %d!\n", a);
    return 0;
}

Cuando utilicéproc_open(), Me gusta esto

$descriptorspec = array(      
0 => array( 'pipe' , 'r' ) ,  
    1 => array( 'pipe' , 'w' ) ,  
    2 => array( 'file' , 'errors' , 'w' ) 
);  
$run_string = "cd ".$addr_base."; ./a.out 2>&1";
$process = proc_open($run_string, $descriptorspec, $pipes);
if (is_resource($process)) {
    //echo fgets($pipes[1])."<br/>";
    fwrite($pipes[0], '12');
    fclose($pipes[0]);
    while (!feof($pipes[1]))
        echo fgets($pipes[1])."<br/>";
    fclose($pipes[1]);
    proc_close($process);
}

Al ejecutar el código C, quiero obtener el primer flujo STDOUT, e ingresar el número, luego obtener el segundo flujo STDOUT. Pero si tengo la línea comentada sin comentarios, la página se bloqueará.

¿Hay alguna manera de resolver el problema? ¿Cómo puedo leer desde la tubería mientras no todos los datos se han colocado allí? ¿O hay una mejor manera de escribir este tipo de programa interactivo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta