[gambit-list] How to monitor arbitrary file descriptors?

Jörg F. Wittenberger Joerg.Wittenberger at softeyes.net
Mon Jul 15 14:49:15 EDT 2019


Am Mon, 15 Jul 2019 11:39:26 -0400
schrieb Marc Feeley <feeley at 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 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