Lendo do canal STDIN ao usar proc_open

Eu estou tentando fazer um site onde as pessoas podem compilar e executar o código on-line, portanto, precisamos encontrar uma maneira interativa para os usuários enviarem instruções.

Na verdade, o que primeiro vem à mente éexec() ousystem(), mas quando os usuários querem inserir sth, desta forma não vai funcionar. Então nós temos que usarproc_open().

Por exemplo, o seguinte código

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

Quando eu useiproc_open(), como isso

$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);
}

Ao executar o código C, quero obter o primeiro fluxo STDOUT e inserir o número e, em seguida, obter o segundo fluxo STDOUT. Mas se eu tiver a linha comentada descomentada, a página será bloqueada.

Existe uma maneira de resolver o problema? Como posso ler o pipe enquanto nem todos os dados foram colocados lá? Ou existe uma maneira melhor de escrever esse tipo de programa interativo?