O Chroot é a maneira mais tradicional de fazer isso, e você pode fazê-lo funcionar, mas como você faz isso por meio de uma interface web, fica um pouco complicado: você deve evitar condições de corrida (vários usuários usam o mesmo ambiente chroot), você deve construir dinamicamente uma estrutura de diretórios para cada solicitação e, provavelmente, algumas outras coisas que não consigo pensar em cima da minha cabeça.
Se você estiver usando o Linux, desejará ver os contêineres ( lxc
) ou o link do projeto do Docker. A plataforma Docker, em particular, permitirá que você faça o que deseja aqui: crie sistemas virtuais leves e de vida curta que possam ser usados para executar processos totalmente presos sem afetar os recursos externos (ou seja, o servidor da Web). Você pode baixar uma imagem docker básica do ambiente específico do sistema operacional que você quer que o programa rode (digamos, Fedora 12), dizer ao docker para rodar esse ambiente enquanto importa a fonte do programa do usuário para esse ambiente e dizer ao docker para executar o compilador e arquivo resultante dentro desse ambiente. Então você diz ao estivador para destruir o ambiente efêmero. Nada fica para trás, (quase) nenhum risco de segurança.