processor pasted by siiky on Tue Apr 13 01:54:30 2021

(module processor
  (processor)

  (import
    scheme
    chicken.base
    chicken.file.posix
    chicken.process)

  ;; @brief Call the command @a cmd with arguments @a args in a subprocess.
  ;;
  ;; @param cmd The command to run; @see chicken.process.process-execute's
  ;;            PATHNAME.
  ;; @param args The arguments to call @a cmd with; @see
  ;;             chicken.process.process-execute's ARGUMENT-LIST.
  ;; @param stdin The file descriptor to use for the subprocess' stdin.
  ;; @param stdout The file descriptor to use for the subprocess' stdout.
  ;; @param stderr The file descriptor to use for the subprocess' stderr.
  ;; @param env An environment alist; @see chicken.process.process-execute's
  ;;            ENVIRONMENT-ALIST.
  ;;
  ;; @returns 4 values: the subprocess' PID, a write file descriptor for stdin, a read
  ;;          file descriptor for stdout, and a read file descriptor for
  ;;          stderr.
  ;;
  ;; @see chicken.process.process-execute
  ;;
  ;; TODO: How to make it easier to wait for the subprocess and get its `wstatus`?
  (define (processor cmd args #!key (stdin #f) (stdout #f) (stderr #f) (env #f))
    (let-values
      (((stdin-r  stdin-w)  (if stdin  (values stdin #f)  (create-pipe)))
       ((stdout-r stdout-w) (if stdout (values #f stdout) (create-pipe)))
       ((stderr-r stderr-w) (if stderr (values #f stderr) (create-pipe))))
      (let ((pid (process-fork
                   (lambda ()
                     (file-close stdin-w)
                     (file-close stdout-r)
                     (file-close stderr-r)
                     (duplicate-fileno stdin-r fileno/stdin)
                     (duplicate-fileno stdout-w fileno/stdout)
                     (duplicate-fileno stderr-w fileno/stderr)
                     ; TODO: Is there a way for `process-execute` to call
                     ;       `execvpe` instead of `execve`?
                     (process-execute cmd args env)))))
        (values pid stdin-w stdout-r stderr-w))))
  )

Example use added by siiky on Tue Apr 13 01:55:56 2021

#;1> processor
#<procedure (processor#processor cmd args . rest)>
#;2> (processor "ls" '())
1776616
4
5
8
; 4 values
#;3> (import chicken.file.posix)
; loading /home/siiky/.local/lib/chicken/11/chicken.file.posix.import.so ...
#;4> (define stdout (open-input-file* 5))
#;5> (read stdout)
processor.build.sh
#;6> (read stdout)
processor.egg
#;7> (read stdout)
processor.import.scm
#;8> (read stdout)
processor.import.so
#;9> (read stdout)
processor.install.sh
#;10> (read stdout)
processor.link
#;11> (read stdout)
processor.scm
#;12> (read stdout)
processor.so
#;13> (read stdout)
processor.static.o
#;14> (read stdout)
processor.types
#;15> (read stdout)
^C
*** user interrupt ***
#;15> (import chicken.process)
; loading /home/siiky/.local/lib/chicken/11/chicken.process.import.so ...
#;16> (process-wait 1776616)
1776616
#t
0
; 3 values
#;17> (read stdout)
^C
*** user interrupt ***
#;17>