Am Mon, 15 Jul 2019 11:39:26 -0400 schrieb Marc Feeley feeley@iro.umontreal.ca:
You can use the ##open-predefined procedure to convert a file descriptor into a Scheme port. The ##wait-input-port procedure can then be used on the port as shown in the example below. You can also use the usual Gambit I/O procedures for doing I/O (for example a read-char on the port will block until data is available on the file descriptor).
Marc
Thank you Marc. This looks like the thing I've been looking for.
So far I did not try. Just reading the source makes me wonder:
lib/io.scm around line 5280 I found the definition of `##open-predefined`. It looks as if there is an oversight: it completedly ignores the optional `settings` parameter. Shouldn't this be somehow mangled into the second parameter of the call to `##make-path-psettings`?
Best
/Jörg
(c-declare #<<end-of-c-declare
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
end-of-c-declare )
(define O_RDONLY ((c-lambda () int "___return(O_RDONLY);"))) (define O_WRONLY ((c-lambda () int "___return(O_WRONLY);"))) (define O_RDWR ((c-lambda () int "___return(O_RDWR);")))
(define posix-open (c-lambda (char-string int int) int "open"))
(define (open path) (let* ((fd (posix-open path O_RDWR 0)) (port (##open-predefined 3 path fd))) port))
(define fifo (open "fifo")) ;; created with: mkfifo fifo
(println "waiting for data on fifo...") (##wait-input-port fifo) ;; wait for data to be readable on fd (println "done waiting!") (println (read-char fifo))
On Jul 15, 2019, at 9:43 AM, Jörg F. Wittenberger Joerg.Wittenberger@softeyes.net wrote:
Hi,
I'm trying to wait for IO on some file descriptor.
The case at hand is not really relevant, it's a unix domain socket in this case. But the same issue would easily apply to other libraries too.
So far I found the gamsock library as a start. But this ties up the processor in a loop attempting to receive, learn EWOULDBLOCK and retry.
As I said, I'm not at all sold to the gamsock library or the API. I just want a thread to block on a raw file descriptor for IO. So maybe there is a way to create a port from a raw file descriptor? Or anything like that? How would it be done?
Thank you so much.
/Jörg
Gambit-list mailing list Gambit-list@iro.umontreal.ca https://mailman.iro.umontreal.ca/cgi-bin/mailman/listinfo/gambit-list