process(7)
MILESTONE-QUALIFIED
Rendered from the page's mdoc source at milestone/general-usability-qemu-20260927 (platform ff025b1)
with GNU groff version 1.23.0, using the same command the image build uses; an ABSD session running
man 7 process prints this text. It is dated 2026-09-27; the build commands and
repository files it mentions are in private sources, and later work is not in it.
All pages.
PROCESS(7) Miscellaneous Information Manual PROCESS(7) NAME process -- processes, starting programs, waiting, and parentage on ABSD DESCRIPTION A process is an address space, a table of handles (handles(7)), a PID, a parent, and exactly one task: there are no threads. PIDs are not reused within a boot; process table slots are. There are sixteen slots in the whole system. Starting a program A new program is always a new process. There is no fork() and no exec() that replaces a running program. To run a program from the filesystem, the parent reads the whole file with its own filesystem authority and hands the bytes to the kernel, which checks and loads them into a new process (spawn_image()). The file must be a static x86-64 ELF executable of at most 32 MiB: no dynamic linking, no interpreter, no `#!' scripts. There is no execute permission; what stands in for it is the spawn right, a per-process attribute without which every start is refused. Nothing restores it once withheld. The child starts with an ordered set of handles copied from the parent, never with more rights than the parent's copy, and a startup record on its first handle carrying its arguments, environment, working directory, and program name. Its standard input, output, and error are kernel pipes (or the parent's own streams, copied); there are no file descriptors. Everything else about its authority is in handles(7). Waiting and killing Starting a child gives the parent a process handle with the wait and kill rights. With it the parent can wait for the child to end, which collects its outcome and frees its slot (reaping), or kill it: the child ends at once, wherever it was blocked, and everything it held is released. A process ends in one of three ways: it exits with a status, it faults (the kernel records the vector and address), or it is killed. In a shell, a fault or kill is reported as status 128. There are no signals. Nothing interrupts a process from outside except its parent's kill. ^C on a session's terminal is not delivered to any process: the SSH server tells the session's shell on a control channel of its own, and the shell, the parent, kills its running commands; see absd-sh(1). A write to a pipe whose readers are all gone fails with a broken-pipe error; it does not stop the writer. Parentage The parent is the process that started the child; nothing else is. When a process ends, its children are reparented to init (orphan adoption). Adoption grants init no handle and no authority over them; it lets init reap them when they end. There is no process-tree kill: ending a process does not end its children. In an SSH session the tree is: sshd starts the session's shell (or, for `ssh host command', that command); the shell starts the commands you type. When the client disconnects, sshd kills and reaps the session's first process. Commands the shell started are the shell's children, not sshd's: they are adopted by init and run to their own end, when init reaps them. Until then their standard input reads end of file, their writes to the terminal fail, and the file server refuses their channel; they keep the spawn right. What a process can see A process can inspect itself and, through the process handles it holds, its own children, and nothing else. There is no list of all processes. A session's listing, ps(1), is the SSH server's answer for that session alone: it names the session's shell, which it holds a handle to, and counts what else holds the session's input and filesystem channels. There is no kill command: only a parent ends a child. Replacement is not recovery Starting a new instance of a program after an earlier one ended is a restart, and the new instance is a replacement. A replacement is not a recovery: recovery is claimed only once the replacement has read the state the earlier instance left and reconciled it. In the qualified boot nothing is restarted. If the SSH server ends, or the file server ends while the SSH server runs, the boot ends and is reported failed. A policy for replacing either in a long-running boot is not defined yet. SEE ALSO absd-sh(1), ps(1), filesystem(7), handles(7) In the kernel repository: docs/PROCESS-STARTUP.md (the start contract and the startup record) and docs/TERMINOLOGY.md. CAVEATS Interrupting a command ends that command only; programs it started keep running, adopted by init, with whatever of the session they hold. Sixteen processes are few: init, the file server, and the SSH server take three, and each open shell running a pipeline takes one per command. ABSD September 27, 2026 PROCESS(7)