readv - incorrect behavior?

Hirsch, Matthew MHirsch@analogic.com
Mon Jul 28 22:40:00 GMT 2003


Hi list.

I've encountered a problem with the readv system call under Cygwin of the
form

	int readv(int fd, const struct iovec *vector, int count);

It appears that readv is reading past the end of the file described by fd
and instead reading until each buffer in the iovec is filled.  This is not
limited to disk files, as I originally came across this problem when reading
from a pty's file descriptor.

The attached program and input file demonstrate the error.  Please note, in
the example I opened the file with the command

        test_fd = open("testfile.foo",O_RDWR);

however, the same behavior is observed opening the file as

        test_fd = open("testfile.foo",O_RDWR | O_TEXT);

or

        test_fd = open("testfile.foo",O_RDWR | O_BINARY);

The output I got from running this program is as follows:

$ ./readv_test
Total Bytes: 25
Vectors:
        12345
        *789012345
♠o☺a    ►

You should notice that although there are only 16 bytes in the file, readv
returns the summed length of the two buffers in the iovec, 25.  In the test
case I pad the buffers with 'X's, so it is clear that readv is copying data
into them from somewhere.

More confusing still, replacing the readv call with

	bytes_read = read(test_fd, arr1, 20);

works flawlessly.

It appears to me that in fhandler.cc, readv simply calls read.  I will admit
that my understanding of how these c++ libraries are called from a c program
is limited.

I've included output from cygcheck -s, though I just updated my installation
with setup a minute ago.

Thanks!
Matt Hirsch

P.S. The only real discussion I found in the mailing lists related to the
readv call was with regard to a patch submitted by Conrad Scott.  The
current code seems to differ in some details to Conrad's patch.  Has this
been updated more recently than that?  Granted, I'm not subscribed to the
developer's mailing list... ;)  I haven't tried this with any old versions
of Cygwin.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: readv_test.c
Type: application/octet-stream
Size: 787 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20030728/c20b1e35/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: testfile.foo
Type: application/octet-stream
Size: 16 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20030728/c20b1e35/attachment-0001.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cygcheck
Type: application/octet-stream
Size: 15326 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20030728/c20b1e35/attachment-0002.obj>
-------------- next part --------------
--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


More information about the Cygwin mailing list