From d70f0029f0808e0a3724150a081015e0f943dfb5 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Mon, 28 Sep 2026 14:59:17 -0300 Subject: A command pane's command is over when its process exits, not when its pty closes A job left in the background (sleep 100 &) held the pty open, so the pane stayed running and the child a zombie until the job ended; a command that closed its terminal and ran on got its end of file at once, the host waited 100 ms for an exit, reported exit ? and hung it up. Now each command's child is watched on a thread (waitid with WNOWAIT, so its pid stays its own until the host reaps it), and the host tells the core the exit from that: after the pty's end of file, so the output before the exit is in, or 50 ms after the exit without one, a job holding the pty. The pty stays open until both, so a command that let go of its terminal is never hung up by it. All four front ends; a host that cannot start the watcher reads the exit at end of file as before. Tests: host_io's for both cases, and cmdexit.snap end to end. Co-Authored-By: Claude Opus 5.5 --- test/snapshots/cmdexit.golden | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/snapshots/cmdexit.golden (limited to 'test/snapshots/cmdexit.golden') diff --git a/test/snapshots/cmdexit.golden b/test/snapshots/cmdexit.golden new file mode 100644 index 00000000..58412752 --- /dev/null +++ b/test/snapshots/cmdexit.golden @@ -0,0 +1,14 @@ +== snap opened grid=120x31 cursor=7,3 +|Newcol Joincol Find Grep Help Changelog Tutor Dump NextColor Debug Exit +| New Tty Find Grep Joincol Delcol +| /tmp/pardes-snap/cmdexit/cwd/cmds.txt Save Tty Collapse Del +| 1 sleep 30 & echo BG''STARTED +| 2 exec /dev/null 2>&1; sleep 1; false +== snap background grid=120x31 cursor=7,3 +|17: /tmp/pardes-snap/cmdexit/cwd (sleep 30 & echo BG''STARTED) exit 0 Kill Save Collapse Del +|18: BGSTARTED +|19: exit 0 +== snap letgo grid=120x31 cursor=7,3 +|17: /tmp/pardes-snap/cmdexit/cwd (exec /dev/null 2>&1; sleep 1; false) exit 1 Kill Save Collapse Del +|20: % exec /dev/null 2>&1; sleep 1; false +|21: exit 1 -- cgit v1.3