Онлайн компилятор C - PullRequest
       1

Онлайн компилятор C

0 голосов
/ 14 апреля 2011

Я делаю свой последний годовой проект «Программное обеспечение как услуга», и «Online C Compiler» является одной из предполагаемых услуг.Пожалуйста, помогите мне, как я могу вызвать AC-компилятор, например, GCC, чтобы выполнить код C, написанный в текстовой области браузера, и вернуть результат, который, в свою очередь, отображается в браузере.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 14 апреля 2011

Легко! Просто запустите его через одну из многих функций выполнения PHP.

Пример кода:

<code>// atomic temp file with .c extension
do {
    $tmpfile = tempnam(sys_get_temp_dir(),'source');
}while(!@rename($tmpfile,$tmpfile.'.c'));

$tmpfile.='.c'; // rename succeeded, update file name
$exefile='test.exe'; // works on linux as well, linux ignores extension

file_put_contents($tmpfile,$_REQUEST['c_code']);

// invoke GCC
$output = shell_exec('gcc '.escapeshellarg($tmpfile).' -o '.escapeshellarg($exefile));
// set sticky bit
$output.= shell_exec('sudo +s '.escapeshellarg($exefile)); // I need to set this on my server
// run the created program
$output.= shell_exec(escapeshellarg($exefile));

echo '<pre>'.htmlspecialchars($output,ENT_QUOTES).'
';

Приведенный выше код (хотя и не проверенный) должен работать. Если вам нужна более продвинутая процедура выполнения процесса (написать STDIN, прочитать STDOUT и STDERR, а также получить код возврата):

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @return array Array of "stdout", "stderr" and "return".
 * @copyright 2011 K2F Framework / Covac Software
 */
function execute($cmd,$stdin=null){
    $proc=proc_open($cmd,array(0=>array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w')),$pipes);
    fwrite($pipes[0],$stdin);                      fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);        fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);        fclose($pipes[2]);
    $return=proc_close($proc);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}
1 голос
/ 14 апреля 2011

Не думаю, что вы хотите, чтобы выполнял произвольный код вне какого-либо контейнера. В то время как код должен работать в неблагоприятных условиях в большинстве случаев, вы рискуете:

  • Кто-то щекочет ошибку повышения привилегий в вашем ядре (вспоминается старая ошибка vmsplice)
  • Кто-то настраивает неприятную сетевую службу
  • Кто-то швыряет СПАМ в четыре угла Интернета (я их никогда не видел, но я уверен, что в Интернете есть есть углы)
  • Кто-то намеренно мешает нормальному использованию вашего сервера, выполняя раздражающий код.

Я бы рекомендовал, учитывая те потенциальные проблемы, в которых вы используете какую-то технологию виртуализации для фактического запуска кода. Некоторые кандидаты будут:

  • QEMU (Быстрый грязный)
  • Lguest (Быстрый и грязный)
  • OpenVZ (немного сложнее)
  • Паравиртуализация Xen (Требуется гипервизор, но идеально подходит для вашего использования)

Если у вашего университета есть доступ к таким инструментам, как Simics, вы, вероятно, могли бы использовать его вместо этого и предложить более полную отладку на уровне машины. Я не уверен, это было в то время как , так как я использовал Simics.

В этих случаях вы должны сделать копию операционной системы, поместить загруженный код в нее и выполнить сценарии для сборки, запуска и сбора выходных данных при загрузке. Это позволяет устанавливать строгие правила относительно продолжительности выполнения кода, сохранять его изолированным и предлагать сборки на нескольких архитектурах. Просто направьте выходные данные сборки и программы в файл, который вы получите после выполнения.

Также необходимо убедиться, что среда сборки поддерживает максимально возможное количество локалей.

Если вы хотите получить бонусные баллы, используйте также Valgrind. Тем не менее, вы захотите установить ограничение на уровень сложности сборки, который вы хотите обрабатывать ... чтобы вы могли сосредоточиться на функциях, которые делают вашу систему удобной для ее заявленной цели.

В любом случае, семейство вызовов PHP exec() / shell_exec() должно быть достаточно, чтобы ваш интерфейс запускал скрипт, который запускает все остальное.

0 голосов
/ 14 апреля 2011

Вы не можете выполнить код C в браузере, но вы можете написать программу cgi (на C / C ++ или Perl), которая может принять код C в качестве входных данных и затем выполнить этот код C с помощью локального компилятора gcc.Вы можете вызвать этот CGI из браузера, как и любую другую ссылку http.Наконец вы должны прочитать ответ CGI и распечатать ответ в вашем браузере.Чтобы иметь представление о CGI, взгляните на http://httpd.apache.org/docs/1.3/howto/cgi.html и http://www.guyrutenberg.com/2007/08/10/introduction-to-c-cgi/

0 голосов
/ 14 апреля 2011

Поскольку вы отметили это с помощью PHP, см. Справочную страницу php для функции shell_exec .Вы можете вызвать GCC следующим образом, например:

$command = "gcc -w -Wall -ansi -pedantic -g -o /path/to/executable /path/to/sourcefile";
$output = shell_exec($command);
echo $output;

РЕДАКТИРОВАТЬ: В случае, если это не очевидно, вам сначала нужно получить и очистить ввод пользователя из текстовой области, записать его в файл, изатем попробуйте скомпилировать его.

0 голосов
/ 14 апреля 2011

Вы можете найти этот проект полезным.Это gcc REPL (чтение, оценка, цикл).Упаковка в CGI должна дать вам то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...