Skip to content

fix(watcher): enforce time limit by wall clock instead of RLIMIT_CPU - #311

Open
ZnPdCo wants to merge 4 commits into
Project-LemonLime:masterfrom
ZnPdCo:fix/watcher-wall-clock-time-limit
Open

fix(watcher): enforce time limit by wall clock instead of RLIMIT_CPU#311
ZnPdCo wants to merge 4 commits into
Project-LemonLime:masterfrom
ZnPdCo:fix/watcher-wall-clock-time-limit

Conversation

@ZnPdCo

@ZnPdCo ZnPdCo commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

RLIMIT_CPU 限制 CPU time,而主程序仅测量 user time,这会导致部分程序提前结束运行。同时,sleep 这类没有产生 cpu time 的程序会显示成内部错误,不美观。

现在 watcher 从主进程接收 extra wall-clock 限制,并使用 timerfd + pidfd 或 kqueue 来进行时间限制。超时后杀死子进程,并报告 TLE。

这个 pr 是 #306 的一个子 pr,由于 #306 进行的「沙箱移进 watcher」的重构仍待商榷,所以这里先把这个 bug 修复抽离出来。

RLIMIT_CPU limits CPU time while the judge measures user time, and a
program that merely sleeps never hits it, so a sleep-only program could
run forever. The watcher now receives the extra wall-clock grace
(argv[12], ms) from the main process and enforces timeLimit + extraTime
with timerfd + pidfd (Linux) / kqueue (macOS), killing the child on
timeout and reporting TLE. The sandbox stays in the main process
(bwrap), which only keeps a 1s backstop against a hung watcher.
Comment thread unix/watcher_unix.cpp Outdated
ZnPdCo added 3 commits August 15, 2026 08:22
RLIMIT_CPU limits CPU time while the judge measures user time, and a
program that merely sleeps never hits it, so a sleep-only program could
run forever. The watcher now receives the extra wall-clock grace
(argv[12], ms) from the main process and enforces timeLimit + extraTime
with timerfd + pidfd (Linux) / kqueue (macOS & BSD), killing the child on
timeout and reporting TLE. The sandbox stays in the main process
(bwrap), which only keeps a 1s backstop against a hung watcher.
The watcher now waits for the child with clone3 + CLONE_PIDFD, which
requires Linux 5.3+. Distros with older kernels (Ubuntu 18.04, Debian
10, Mint 19.3, Deepin 15.11, openSUSE Leap 15.1) can no longer run the
watcher, so remove them from the tested list and keep NOI Linux 2 as the
baseline.
@ZnPdCo
ZnPdCo requested a review from CoelacanthusHex August 15, 2026 03:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants