Mail Archives: cygwin/2005/12/07/17:47:24
>> On Dec 7 11:55, Loh, Joe wrote:
>> QUESTION:
>>
>> Is there a way in Cygwin to do a read of a block device using "C"
that
>> does not do a read-ahead? We needed to develop an application that
>> will issue the exact transfer size to the target device as requested.
>> Looking at the strace, it appears that read() less than 61440-bytes
>> gets translated to reading 61440 bytes into buffer and then a subset
>> of that read is returned to the caller.
>
> There's a non-portable (only Cygwin) way to set the buffer size after
opening a device:
>
> #include <cygwin/rdevio.h>
>
> struct rdop rd;
>
> fd = open ("dev/sda", ...);
>
> rd.rd_op = RDSETBLK;
> rd.rd_parm = 0; /* Unbuffered reading */
> rd.rd_parm = 1; /* Unbuffered reading */
> rd.rd_parm = n; /* Buffered reading with buffer size n */
>
> ioctl (fd, RDIOCDOP, &rd);
>
> Note that the ioctl fails if the buffer already contains data, so
ioctl should be called before the first > read. Also note that in
unbuffered mode the usual Windows blocking rule applies, the length
given to read > must be a multiple of 512.
>
> Sigh, it seems that I introduced a bug into this ioctl also not long
ago.
> I fixed this in CVS. Recent code will probably not work very well
when setting it to unbuffered mode. Please wait for the next developers
snapshot.
>
>
> Corinna
Thank you ... This will work. Any plans on supporting O_DIRECT flag in
open()? We believe this effectively gives unbuffered I/O. Please
correct if we are making the wrong assumption.
Again. Thank you for the recommendation and we will wait for the next
Cygwin Kernel before porting our codes over.
--
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/
- Raw text -