Я пытаюсь создать сайт, на котором люди могут компилировать и запускать свой код в Интернете, поэтому нам нужно найти интерактивный способ отправки пользователями инструкций.Чтение из трубы STDIN при использовании proc_open
На самом деле, первое, что приходит на ум, это exec()
или system()
, но когда пользователи хотят ввести sth, этот способ не будет работать. Поэтому мы должны использовать proc_open()
.
Например, следующий код
int main()
{
int a;
printf("please input a integer\n");
scanf("%d", &a);
printf("Hello World %d!\n", a);
return 0;
}
Когда я proc_open()
, как этот
$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);
}
При выполнении кода C, я хочу, чтобы получить первый поток STDOUT, и введите номер , затем получите второй поток STDOUT. Но если у меня есть прокомментированная строка без комментариев, страница будет заблокирована.
Есть ли способ решить эту проблему? Как я могу читать из трубы, пока не все данные были там поставлены? Или есть лучший способ написать такую интерактивную программу?
Ваш «пользователь», взаимодействующих с веб-сайта? Потому что таким образом у пользователя нет прямого доступа к 'STDIN' вашего сервера. – Passerby
@Passerby Пользователь нажимает кнопку для компиляции и вводит _x_ и отправляет ее на сервер. Но прежде чем он введет _x_, сервер должен сначала получить поток из «STDIN» и отправить его на сайт, чтобы пользователь знал, что он должен ввести _x_.Проблема в том, что сервер не может получить поток в этот момент. – dahui