Hello, As of Guile 2.2.3, the Scheme-level ‘select’ can return non-empty sets when the C-level ‘select’ returns EINTR or EAGAIN. The program below illustrates this: --8<---------------cut here---------------start------------->8--- (use-modules (ice-9 match)) (sigaction SIGINT (lambda args (pk 'signal! args))) (let ((target (getpid))) (match (primitive-fork) ((? zero?) (sleep 4) (kill target SIGINT) (primitive-exit 0)) (_ #t))) (match (select (list (current-input-port)) '() '()) (((port) () ()) (pk 'reading-from port) (read-char port)) (lst (pk 'done lst))) --8<---------------cut here---------------end--------------->8--- On 2.2.3, it prints: --8<---------------cut here---------------start------------->8--- $ guile select.scm ;;; (signal! (2)) ;;; (reading-from #) --8<---------------cut here---------------end--------------->8--- From there on it’s stuck in a read(0, …) call. The attached patch fixes it by clearing the returned FD sets on EINTR/EAGAIN. (Besides it seems that select(2) never returns EAGAIN.) I’m not sure how to write a test for this; the one above is timing-sensitive, which wouldn’t be great. Thoughts? Ludo’.