我认为解决这个问题的一个办法是限制。但我在 domjudge 中发现了以下代码,有人能解释一下他们是如何处理这个问题的吗?他们没有使用 ulimit。我不擅长 shell。但你的一点帮助仍然可以消除我的疑虑。
# Runs command without error trapping and check exitcode
runcheck ()
{
set +e
$@
exitcode=$?
set -e
}
runcheck $GAINROOT $RUNGUARD ${DEBUG:+-v} ${USE_CHROOT:+-r "$PWD"} -u "$RUNUSER" \
-t $TIMELIMIT -m $MEMLIMIT -f $FILELIMIT -p $PROCLIMIT -c -o program.time -- \
$PREFIX/run $PREFIX/$PROGRAM \
testdata.in program.out program.err program.exit \
>error.tmp 2>&1
运行脚本:
PROGRAM="$1"; shift
TESTIN="$1"; shift
OUTPUT="$1"; shift
ERROR="$1"; shift
EXITFILE="$1"; shift
运行程序时重定向输入、输出和 stderr
$PROGRAM <$TESTIN >$OUTPUT 2>$ERROR
exitcode=$?
printf "$exitcode" >$EXITFILE
exit $exitcode
答案1
Ulimit 从 shell 工作(实际上调用ulimit
系统调用)。
在 DOMjudge 中,限制是使用程序设置的runguard
。如果您想了解更多详细信息,请参阅源代码,或在DOMjudge 邮件列表