基于Linux系统调用使用php实现一个在线编译运行C语言程序的系统

     前段时间给学校做一个在线练习C语言程序和C语言考试的系统,服务器架构是LAMP的。因为其他的都没什么好多的,要实现在线编译只要exec()函数直接调用gcc进行编译就行了,

    这里解释一下命令:$filename是你的C语言源程序的地址,-o指定生成可执行文件名,2>compile_result.txt是将编译结果输出到compile_result.txt文件里面去(gcc的编译结果是输出到标准错误2的而不是标准输出1)分号是本语句结束,下一个语句是编码转换的命令,因为我要返回的是gb2312编码的字符,所以就将之前的编译结果文件转换成GB2312编码放到compile_res.txt里面去了。这里实现其实很多余,因为你完全可以就enconv -L zh_CN -x UTF-8 filename直接搞定,但是蛋疼的是服务器居然没有这个工具。没办法之下才用的iconv。如果客户要的就是UTF-8编码的话,那直接 2>&1就OK了,都不用临时文件咯~

    接下来是要在客户端上运行我们的C程序,并且将程序的输出输出到浏览器上。(并且能够读入用户端在浏览器输入的输入)这才是我们的重头戏!
首先,我们的实现还是基于临时文件和系统调用的基础之上实现的。不错如果要把用户的输入给弄到程序里面去的话,仅仅这样是不行的,下面我来说下我的实现方法:

主要的代码就是这样,这里的run_me程序是一个用C语言写的,将用户程序作为一个子进程运行,并且将用户程序的标准输入关闭,通过管道把input.txt的内容输入到用户程序中。(这里需要写过Linux下的进程最后输出运行结果的操作。
run_me的源代码如下:

 

如果熟悉在Linux下操作的朋友门一定觉得我上面的操作有点多余,直接就运行./prog_name < input.txt不就完了么?呵呵,是这样的,但是你要想到,如果用户是一个死循环程序,那么,你的服务器估计活不了太长的时间,如果只在系统层面limit对系统做限制,又不能保证大量用户同时使用这个系统。所以我才自己手动实现了一个重定向操作,并且加入了只让用户程序执行10毫秒的元素,这样就解决问题了~呵呵,如果有更好的方法希望大家推荐一下。也欢迎大家指出我的错误和问题。有什么不明白的地方也可以说出来大家讨论讨论~~

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值