[gambit-list] How to monitor arbitrary file descriptors?
Marc Feeley
feeley at iro.umontreal.ca
Mon Jul 15 11:39:26 EDT 2019
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
(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 at 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 at iro.umontreal.ca
> https://mailman.iro.umontreal.ca/cgi-bin/mailman/listinfo/gambit-list
More information about the Gambit-list
mailing list