Ich versuche, eine Website, wo Menschen ihren Code online kompilieren und ausführen können, so müssen wir eine interaktive Möglichkeit für Benutzer zum Senden von Anweisungen finden.Lesen von STDIN-Rohr bei der Verwendung von proc_open
Eigentlich, was zuerst in den Sinn kommt ist exec()
oder system()
, aber wenn Benutzer etw eingeben möchten, wird dieser Weg nicht funktionieren. Also müssen wir proc_open()
verwenden.
Zum Beispiel den folgenden Code
int main()
{
int a;
printf("please input a integer\n");
scanf("%d", &a);
printf("Hello World %d!\n", a);
return 0;
}
Als ich proc_open()
verwendet, wie diese
$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);
}
Wenn die C-Code ausgeführt wird, ich das erste STDOUT Stream erhalten möchten, und geben Sie die Nummer , dann hol dir den zweiten STDOUT-Stream. Wenn die Kommentarzeile jedoch nicht kommentiert ist, wird die Seite blockiert.
Gibt es eine Möglichkeit, das Problem zu lösen? Wie kann ich aus der Pipe lesen, obwohl nicht alle Daten dort abgelegt wurden? Oder gibt es eine bessere Möglichkeit, diese Art von interaktivem Programm zu schreiben?
Ist Ihr "user" die Interaktion von Website beendet? Denn auf diese Weise scheint der Benutzer keinen direkten Zugriff auf den STDIN Ihres Servers zu haben. – Passerby
@Passerby Der Benutzer drückt eine Schaltfläche zum Kompilieren und gibt _x_ ein und sendet sie an den Server. Aber bevor er _x_ eingibt, muss der Server zuerst den Stream von "STDIN" holen und an die Website senden, so dass der Benutzer weiß, dass er _x_ eingeben soll.Das Problem ist, dass der Server den Stream in diesem Moment nicht bekommen kann. – dahui