From bb4f468b73c8a888bec1e5b2ba7f1575ab7f8456 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 16 Jul 2026 11:15:12 +0200 Subject: jobs: background execution (&), non-blocking reap, spin demo - sys_reap: nohang reap of a finished zombie child (-> pid or 0). - shell: 'cmd &' launches in the background (prints [pid], no wait); reaps finished jobs at the prompt ([pid done]). Foreground now waits for its own child specifically (loops wait(), reporting bg completions meanwhile) so kill reports the right pid. - spin: a process that yields forever - a target for ps/kill. - verified: spin &; ps shows it; kill removes just that one; immortal init; self-finishing bg worker reaped with [pid done]. --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index b0a2edf..fe8a930 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,35 @@ so we use SDCC's native asxxxx path and INCBIN the blob instead. String literals with embedded control chars are also mangled in rgbds mode; C programs pass explicit lengths and emit newlines via `nl()`. +## Processes & jobs + +Every process has a **pid** (1–255, monotonic) and a parent. `getpid`, `wait`, +and a full lifecycle (`fork`/`exec`/`exit`/reaping) already existed; on top of +that: + +- **`ps`** lists live processes (`pid state command`); state is `R`eady, + `B`locked (in `wait`), or `Z`ombie. The PCB records the running program id + (`PROC_PROG`) so `ps` can show names. +- **`kill `** terminates a process (`sys_kill`): marks it a zombie, + reparents its children to init, wakes a `wait`-blocked parent. **pid 1 + (init/the shell) is immortal** — `kill 1` is refused. +- **Background jobs:** `cmd &` runs without waiting; the shell prints `[pid]` + and reaps finished jobs (non-blocking `reap`), printing `[pid done]`. + +``` +$ spin & # a process that just yields forever +[2] +$ ps +1 B sh +2 R spin +3 R ps +$ kill 2 +[2 done] +$ ps +1 B sh +5 R ps +``` + ## Filesystem A tiny **RAM filesystem** lives in **WRAMX (`$D000-$DFFF`, 4 KiB)** — always -- cgit v1.3.1-sl0p