chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

buffered inter-process communication


From: asebian
Subject: buffered inter-process communication
Date: Wed, 9 Mar 2022 22:07:54 +0100

Hi,
I am new to chicken and got stuck trying to do buffered inter-process
communication.
Could someone give me a hint why in the sample code below `copy_b`
freezes whereas `copy_c` works as expected?
Thanks!

#!/usr/bin/env -S csi -s

(import (chicken process)
        (chicken io)
        srfi-1)

(define cmd "/usr/bin/env")

;; copy process out/error to current out/error ports
(call-with-values (lambda () (process* cmd))
  (lambda (in out pid err)
    (close-output-port out)
    (letrec (;; copy string
             (copy_b (lambda (pair)
                       (let ((i (car pair))
                             (o (cdr pair)))
                         (let ((s (read-buffered i)))
                           (if (eof-object? s)
                               (close-input-port i)
                               (write-string s (string-length s) o))))))
             ;; copy char
             (copy_c (lambda (pair)
                       (let ((i (car pair))
                             (o (cdr pair)))
                         (when (char-ready? i)
                           (let ((c (read-char i)))
                             (if (eof-object? c)
                                 (close-input-port i)
                                 (write-char c o)))))))
             ;; recurse over list of port pairs
             (iter (lambda (alist)
                     (unless (null? alist)
                       (for-each copy_b alist) ; <-- copy_? gets called here
                       (iter (filter (lambda (pair)
                                       (input-port-open? (car pair)))
                                     alist))))))
      (iter (list (cons in (current-output-port))
                  (cons err (current-error-port)))))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]