Czytanie z potoku STDIN podczas używania proc_open
Próbuję stworzyć stronę internetową, na której ludzie będą mogli skompilować i uruchomić swój kod online, dlatego musimy znaleźć interaktywny sposób wysyłania instrukcji przez użytkowników.
Właściwie najpierw przychodzi mi na myślexec()
lubsystem()
, ale gdy użytkownicy chcą wprowadzić coś, ten sposób nie zadziała. Więc musimy użyćproc_open()
.
Na przykład następujący kod
int main()
{
int a;
printf("please input a integer\n");
scanf("%d", &a);
printf("Hello World %d!\n", a);
return 0;
}
Kiedy użyłemproc_open()
, lubię to
$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);
}
Podczas uruchamiania kodu C chcę pobrać pierwszy strumień STDOUT i wprowadzić numer, a następnie pobrać drugi strumień STDOUT. Jeśli jednak komentarz nie zostanie zakomentowany, strona zostanie zablokowana.
Czy istnieje sposób na rozwiązanie problemu? Jak mogę odczytać z rury, gdy nie wszystkie dane zostały tam umieszczone? A może jest lepszy sposób na napisanie tego rodzaju interaktywnego programu?