(module process-launch () (import scheme) (cond-expand (chicken-5 (import (chicken base)) (import srfi-18) (import (chicken process)) (import (chicken format)) (import (chicken time))) (else (import chicken) (use posix) (use (only srfi-18 make-thread thread-start! thread-yield! thread-join!)))) (define (launch-process-thread cmd #!optional (cb (lambda _ _))) (let ([t (make-thread (lambda [] (let ([pid (process-run cmd)]) (let lp () (receive (pid2 ok? exit-status) (process-wait pid #t) (if (zero? pid2) (begin (thread-yield!) (lp)) (cb ok? exit-status)))))))]) (thread-start! t) t)) (define threads '()) (define (launch arg) (set! threads (cons (launch-process-thread (format "sleep ~a; echo ~a" arg arg) (lambda ret (print arg " done " ret))) threads))) (launch 1) (launch 3) (time (for-each thread-join! threads)) )