[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Reading data from a file descriptor
From: |
Jan Synáček |
Subject: |
Re: Reading data from a file descriptor |
Date: |
Fri, 13 Nov 2015 21:41:35 +0100 |
On Fri, Nov 13, 2015 at 4:51 PM, Mark H Weaver <address@hidden> wrote:
>
> Jan Synáček <address@hidden> writes:
>
> > On Sun, Nov 8, 2015 at 12:49 AM, Andreas Rottmann <address@hidden>
> > wrote:
> >
> > Also note that if there's no requirement to actually implement
> > this in
> > C, there's `fdes->inport' and `fdes->outport' on the Scheme level,
> > so
> > something like the following would be analogous to the C example
> > code
> > posted:
> >
> > (import (ice-9 binary-ports))
> >
> > (define (process-fd fd)
> > (let ((port (fdes->inport fd)))
> > (display "read: ")
> > (display (get-bytevector-n port 100))
> > (display "\n")))
> >
> > (process-fd (acquire-valid-fd))
> >
> >
> > This is something very similar that I ended up with. Just instead of
> > get-byte-vector, I used read-string!/partial.
>
> I would advise against using 'read-string!/partial' or any of the
> procedures in (ice-9 rw). This is a vestigial module from Guile 1.8
> when strings were arrays of bytes, which they no longer are. We should
> probably mark them as deprecated.
>
> For one thing, when we switch to using UTF-8 as the internal string
> encoding, it will not be possible to keep 'read-string!/partial'
> efficient. It will necessarily have to do an encoding conversion.
>
> In Guile 2+, I would advise using byte vectors when working with binary
> data. Portions of these can be converted to strings with a given
> encoding if desired. I might be able to give better advice if I knew
> more about what you are doing here.
>
> Regards,
> Mark
I have an open fd to a unix socket and I want to read data from it. I
know that the data is going to be only strings, but I don't know the
length in advance. The good thing about using read-string!/partial is,
that I don't have to specify how many bytes I want to read and it does
the right thing. If you point me to a better direction, I'll be
grateful. I came up with:
(for-each (lambda (fd)
(let* ((buf (make-string 4096)))
(read-string!/partial buf (fdes->inport fd))
(format #t "fd[~a]: ~a" fd buf) (newline)))
fds)
--
Jan Synáček
- Reading data from a file descriptor, Jan Synáček, 2015/11/07
- Re: Reading data from a file descriptor, Artyom Poptsov, 2015/11/07
- Re: Reading data from a file descriptor, Artyom Poptsov, 2015/11/07
- Re: Reading data from a file descriptor, Andreas Rottmann, 2015/11/07
- Re: Reading data from a file descriptor, Jan Synáček, 2015/11/09
- Re: Reading data from a file descriptor, Mark H Weaver, 2015/11/13
- Re: Reading data from a file descriptor,
Jan Synáček <=
- Re: Reading data from a file descriptor, Thompson, David, 2015/11/13
- Re: Reading data from a file descriptor, Jan Synáček, 2015/11/16
- Re: Reading data from a file descriptor, Thompson, David, 2015/11/16
- Re: Reading data from a file descriptor, Amirouche Boubekki, 2015/11/16
- Re: Reading data from a file descriptor, tomas, 2015/11/17
- Re: Reading data from a file descriptor, Chris Vine, 2015/11/17
- Re: Reading data from a file descriptor, tomas, 2015/11/17
- Re: Reading data from a file descriptor, Chris Vine, 2015/11/17
- Re: Reading data from a file descriptor, tomas, 2015/11/17
- Re: Reading data from a file descriptor, Jan Synáček, 2015/11/18