概览
这个程序是程序设计判题中的一个步骤,也就是运行用户程序(已经编译好的程序),获取用户运行的结果。
使用了 Linux Namaspace 技术,可以隔离真机网络、PID 等~
PS: 在以后的内容里,统称本程序为 runner。
快速开始
先看几个例子吧。
注意,需要在 root 权限下执行,因为 runner 需要调用系统调用来进行命名空间隔离。
-
runner -l echo.log -u echo.out echo 123
运行echo 123
这个命令:
将输出写入到 echo.out 这个文件,默认日志文件是 runner.log,可以自己随便设置。
-
runner -l ls.log -u ls.out -- ls -al
跟上一句的意思差不多,这次执行的是ls -al
。这次的需要执行的命令带有一个前置-
,所以我们要把命令放在--
后, 这样-
就不会被认为是runner
的参数了。
解释
可以看到,这个程序就是执行你给出的运行命令,重定向你运行的命令的输入输出,并且输出了一个 JSON 字符串。
接下来我就要解释一下这都是什么东西。
首先是本文中会出现的一些名词:
名词 | 解释 |
---|---|
runner | 指本程序 |
待判程序 | 指你让 runner 运行的那个命令。 |
判题数据 | 指要输入给待判程序的数据。 |
第一个例子是我们用 runner 执行 echo 123
,echo 1234
在 Linux 系统中就是在终端输出 1234 的意思。
你会发现使用 runner 运行的程序默认的输入输出好像不见了,你没法输入数据,你预料中的数据也没有输出到终端中。这是因为 runner 默认重定向了待判程序的输入输出到了 /dev/null
这个文件这里,该文件是 Linux 系统中的黑洞,数据输入进去就消失了,从里面读取数据也只能读取到 EOF。
runner 可不只是这么简单的家伙,你可以通过一些参数来开启标准输入输出,或者指定给 runner 某个文件,然后 runner 会从该文件输入或者输出到该文件中。
结果
那么终端里的这个 JSON 格式的字符串是什么?我们可以把它当做这次运行程序的结果。让我们来看其中的一些字段:
exit_code
: 待判程序的退出值。error_code
runner 内部检测到的本次运行出现的错误原因:error_code
为 1 的时候就是说你要运行的命令在环境变量PATH
里找不到。
全部 error_code
的值可见:Code 一览 - error_code
status
这个值的意思就是你的程序运行是对是错了。比如说 0 就代表对了。对了的意思是程序执行的标准输出和你给的测试数据一样。
剩下的就是一些收集到的信息,运行时间,使用的内存等。