Subprocesses


Quick Start

(module demo
  (import std.process std.io)
  (begin
    (let ((result (process:run "git" '("--version"))))
      (println (car result))              ;; exit code
      (println (car (cdr result)))        ;; stdout
      (println (car (cdr (cdr result))))))) ;; stderr

std.process provides blocking and non-blocking subprocess execution. Arguments are passed as a list of strings with no shell interpolation.


API

Blocking

FunctionSignatureNotes
process:run(program args [opts]) -> (status stdout stderr)Default stdout/stderr mode is capture.
process:run-string(program args [opts]) -> string/bytevector/#fConvenience accessor for stdout from process:run.

opts for process:run:


Non-Blocking

FunctionSignatureNotes
process:spawn(program args [opts]) -> handleDefault stdin/stdout/stderr mode is pipe.
process:wait(handle [timeout-ms]) -> exit-code or #fReturns #f on timeout.
process:kill(handle) -> boolHard kill (SIGKILL/TerminateProcess).
process:terminate(handle) -> boolGraceful terminate (SIGTERM/terminate).
process:pid(handle) -> intNative process id.
process:alive?(handle) -> boolNon-blocking liveness probe.
process:exit-code(handle) -> int or #f#f if still running.
process:handle?(x) -> boolProcess-handle predicate.
process:stdin-port(handle) -> port or #fWritable child stdin pipe when configured.
process:stdout-port(handle) -> port or #fReadable child stdout pipe when configured.
process:stderr-port(handle) -> port or #fReadable child stderr pipe when configured.

Patterns

Capture stdout and stderr

(let ((r (process:run "git" '("status" "--short"))))
  (let ((status (car r))
        (stdout (car (cdr r)))
        (stderr (car (cdr (cdr r)))))
    (list status stdout stderr)))

Provide stdin text

(process:run "/bin/cat" '() '((stdin . "hello from eta")))

Timeout guard

(catch 'runtime.error
  (process:run "/bin/sh" '("-c" "sleep 10")
               '((timeout-ms . 250))))

Pipe two spawned processes

(let* ((a (process:spawn "/bin/sh" '("-c" "printf 'a\nb\n'")))
       (b (process:spawn "/bin/grep" '("b"))))
  ;; transfer bytes from a stdout -> b stdin
  ...)

Errors

Operational failures raise runtime errors with stable prefixes:


Notes