Online Compiler
在线编译器
简述
一款简单的在线编译器后台, 支持c
, c++
, java
, python
和javascript
, 后续会支持更多语言
原理
使用
JNI
时加载.so
文件限制的执行 编译 和 运行通过
seccomp
限制syscall
, 例如clone
,fork
,write
,read
,exit_group
等
安装
建议在docker
中使用, 非docker
环境中使用中会存在很多syscall
限制问题
- 执行
sandbox/src/main/c
中的脚本, 生成sandbox.so
文件到/usr/lib/sandbox/sandbox.so
- 后端使用
springboot
, 通过启动类启动
接口示例
Run 提交代码
URL: /just/run
Method: POST
Args:
language
c = 1
,c++ = 2
,java = 3
,python = 4
,javascript = 5
code
codeinput
运行输入
Request示例:
1 | { |
Response示例:
1 | { |
Query 查询执行结果
URL: /just/query
Method: GET
Args:
id
任务的id
Request示例:
1 | curl --location --request GET 127.0.0.1:8080/just/query?id=7ce2e89a-5a04-4810-aadb-d6e957c9aa13 |
Response示例:
data.status
没有任务 = -1, 运行结束 = 0, 仍在运行 = 1data.result.status
运行成功 = 0, 编译错误 = 1, 运行出错 = 2data.result.output
运行的输出
1 | { |
附加
- sandbox部分来源于: QingdaoU/OnlineJudge
- sandbox在某些系统上可能存在syscall 权限问题, 使用
dmesg -T
查看系统调用, 在sandbox
中的c/src/rules
的syscalls_whitelist
中放行该syscall - 在某些机器或系统上
memory
和realTime
可能过大, 可以在src/main/java/com/lc/compiler/config/language/configs
调整为适合大小
Gitee 链接
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.