我正在做最后一年的软件即服务项目,“在线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 );
}

08-27 01:17