Хочу написать свой онлайн компилятор для с++. Принцип работы я понимаю. Человек вводит свой код на сайте в форму, после чего этот код отправляется на сервак, там компилируется и результат обратно. Как отправить файл на сервер ясно, а как сделать так чтобы он там открылся, запустился и выдал результат? С чего начать, где можно об этом почитать и через что это можно делать?
Если знаешь как компилировать из терминала — exec(). Другой вопрос как ты защитишься от выполнения вредоносного кода на сервере, а это тебе точно будет не по силам.
Slavik12, модифицировать компилятор для запрета вызова опасных функций, сендбоксить компиляторы. Путей много и все они слишком сложные для человека, задающего подобные вопросы. Иначе говоря — забить.
есть относительно простой способ - изоляция чужого кода в песочнице. Надежнее и проще всего это сделать с помощью виртуализации, т.е. собираете виртуальную машину (минимальный набор пакетов, который может понадобиться тем кто будет пользоваться вашим сервисом), без какого либо доступа в мир (только stdin/stdout), затем создаете ее копию (лучше воспользоваться снапшотами, они есть в любой современной среде виртуализации) и заливаете в нее пользовательское приложение, запускаете, ждете окончание его работы или по таймауту, останавливаете виртуальную машину и показываете результат на сайте. На практике, чтобы пользователь не ждал запуска виртульной машины, вы можете запустить ее заранее, в режиме ожидания пользовательского когда.
Изоляция виртуальной машиной самая надежная и самая простая по использованию но очень затратна по ресурсам, ведь вы фактически симулируете полноценную машину. Особенно это актуально, если вы будете держать пул запущенных машин, ожидающих пользовательских приложений для запуска (а пользователей может быть много).
Как альтернатива, если вы ограничите среду ос linux, вы можете качественно настроить cgroup и права пользователя, так что запуская приложение оно будет максимально ограничено в возможностях. Собственно на этом основаны те же контейнеры lxc или докер или куча других.
Нужно написать скрипт на языке PHP, который будет на сервере запускать компиляцию с помощью команды shell_exec().
Но конечно было бы небезопасно исполнять на сервере произвольный код. Поэтому компиляцию и выполнение следует производить в виртуальной машине.
Теоретически можно использовать любой язык, доступный через CGI-BIN, но на практике такой скрипт очень сложно отладить. При любой ошибке сервер просто будет выдавать 500: Internal Server Error. На PHP писать и отлаживать скрипты гораздо легче.