Корректировка значений для stdin для онлайн-судьи
Я делал онлайн-судью и сталкивался с проблемой.
Что я делал до сих пор?
Итак, мой PHP-код принимает код пользователя и передает его функции Compile(), которая компилирует код и сообщает, была ли компиляция успешной или нет. Эта часть кода работает очень хорошо.
Теперь все, что осталось, запускает код и оценку
Моя проблема
Моя проблема заключается в том, как обращаться с входами stdin для пользователя. Пользователь обычно принимает входные данные из stdin с помощью scanf, BufferedReader и т.д., И эти значения обычно берутся с клавиатуры. Теперь предположим, что я написал эти значения в файле. Как я буду кормить их эти значения.
Мои попытки
Ну, я искал разные способы, и я наткнулся на это.
fopen('php://stdin', 'w')
Если я считаю, что это работает как файл, это не вызовет проблемы, если несколько пользователей используют stdin в Sametime.
Ответы
Ответ 1
Если у вас есть скомпилированный код и он знает его, он немного проще.
Вы можете использовать функцию exec для выполнения кода, и вы можете использовать ее как команду, что-то вроде этого (для программы ac и протестировано):
$output = array();
exec("./main < sample_input.txt", $output);
И если вы теперь проверяете $output var, у него есть запись в массиве для каждой выводимой строки.
Надеюсь, что это поможет.
Ответ 2
Точно, exec - это все, что вам нужно в PHP.
Однако, если вам нужно не только работать, но и оценивать, вы должны
постройте некоторую оболочку script для запуска, подачи, получения вывода и проверки правильности вывода.
Не забудьте правильно создать песочницу script, потому что это угроза безопасности.
Exec btw. предлагает также третий параметр, возвращающий значение. Это очень полезно, если вы создаете собственную оболочку script с ее собственными кодами возврата.
exec ('./script.sh', $output, $exit_code)
Помните, что php script должен иметь разрешения на файлы и каталоги.