跳转至

编译及使用

编译

需要在 GCC(7 以上) 环境下编译使用。

可以设置 CC 变量以置顶自己的编译器版本,如:export CC=gcc-9

make runner

会在当前目录编译出一个可执行文件 runner

在 Ubuntu 下编译

需要先安装工具链。

sudo apt-get update
sudo apt-get -y install build-essential

在 alpine 下编译

需要先安装工具链。

apk update && apk add --no-cache git gcc musl-dev make argp-standalone

需要注意的是需要安装 argp-standalone,然后 make 打包的时候需要添加 /usr/lib/libargp.a(配置文件里已经做了这一步)。

运行

只需要执行 ./runner [选项...] <命令> [参数...] 即可,比如:

./runner -l node.log -t 1000 -m 2048 --mco -i ./tests/node/1.in -o ./tests/node/1.out -u node.tmp.out -- node ./tests/node/main.js

各参数意义见 选项

最后的 node ./tests/node/main.js 就是要执行的命令。

更多选项可以输入 ./runner --help 查看帮助,或者查看 选项

如果执行待判程序的命令的参数中需要使用到 -(如想用 runner 运行: python --version),那你需要将这个参数放在 runner 参数里的 -- 后,如:

./runner [选项...] <命令> [参数...] -- [放在这里...]
# 比如
./runner -t 2000 -- python --version

反正只要是「想传给待判程序的,并且以 - 开头的的参数」,就要放在 -- 后面。 放在 -- 前面的话,会被认为是 runner 的参数。

读取运行结果

读取程序的标准输出,输出的是 JSON 格式的结果,用解析 JSON 的包解析一下就好了。

判断 runner 自身是否运行成功

看 runner 进程的退出值。
如果 runner 自身都运行出错了,那这次判题就失败了。

解析结果

以下的值是 runner 提供的有关运行待判程序的信息:

  "error_code": 0,
  "signal_code": 0,
  "exit_code": 0

其实只需要关注的就是 error_code 就好,代表 runner 告诉你为什么错了。其他两个值都是为了调试方便展示出来的,

signal_code 是导致子程序异常退出的信号值。 exit_code 是子程序的正常退出值(比如 exit(1))。

error_code 是根据 signal_codeexit_code 总结出来的错误,

比如如果 error_code 为 1,就表明没有找到要运行的用户程序。你就可以发现,当 error_code 为 1 的时候,signal_code 为 12,exit_code 为 0。

如果 error_code 为 0,大概率就说明本次判题执行成功了,这时候你就可以使用 status 的值当成本次的判题结果。 如果这几个 *_code 有不为 0 的,可以在判题日志中查看更多信息,看看到底是哪里错了。

这些 Code 的相关请看:Code 一览

判题结果 status 含义请看:Code 一览 - status

一些数据的单位

时间相关

其中 cpu_time_usedreal_time_used 单位都是毫秒(ms)。 cpu_time_used_usreal_time_used_us 单位是微秒(us)。

内存相关

memory_used 单位是 kb。

log 中的也有一些数据,一般都把单位带上了再输出的。