我正在做最后一年的软件即服务项目,“在线C编译器”是我想要的服务之一。
请帮助我如何调用GCC这样的c编译器来执行在浏览器文本区域中编写的c代码,并返回在浏览器上依次显示的输出。
谢谢您。
最佳答案
容易的!只需通过许多PHP执行函数之一运行它。
示例代码:
// 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).'</pre>';
上面的代码(尽管未经测试)应该可以工作。如果需要更高级的进程执行例程(编写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 );
}