Messages in this thread | | | Subject | Re: O_DIRECT foolish question | From | Bruno Diniz de Paula <> | Date | 12 Feb 2003 18:22:35 -0500 |
| |
Just to complete the information, I am trying to read a file with 5 bytes, and here is the piece of code I am using:
char *message; int fd = open("/var/tmp/testopen.txt", O_RDONLY|O_DIRECT); int len, pagesize = getpagesize();
posix_memalign((void **)&message, pagesize, pagesize); if(fd < 0) { printf("Unable to open file, errno is %d.\n", errno); } else { if((len = read(fd, message, pagesize)) < 0) { perror("read"); } else { printf("%d bytes read from file.\n", len); printf("Message: %s", message); } } close(fd);
Thanks,
Bruno.
On Wed, 2003-02-12 at 18:02, Bruno Diniz de Paula wrote: > On Wed, 2003-02-12 at 17:42, Chris Wedgwood wrote: > > On Wed, Feb 12, 2003 at 05:29:52PM -0500, Bruno Diniz de Paula wrote: > > > > > But I am using multiples of page size in both buffer alignment and > > > buffer size (2nd and 3rd parameters of read). The issue is that > > > when I try to read files with sizes that are NOT multiples of block > > > size (and therefore also not multiples of page size), the read > > > syscall returns 0, with no errors. > > > > What filesystem? > > ext2. > > > > > Can you send an strace of this occurring? > > execve("./testopen", ["./testopen"], [/* 30 vars */]) = 0 > uname({sys="Linux", node="urca", ...}) = 0 > brk(0) = 0x80497fc > open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or > directory) > open("/etc/ld.so.cache", O_RDONLY) = 3 > fstat64(3, {st_mode=S_IFREG|0644, st_size=57677, ...}) = 0 > old_mmap(NULL, 57677, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40012000 > close(3) = 0 > open("/lib/libc.so.6", O_RDONLY) = 3 > read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0]Z\1\000"..., > 1024) = 1024 > fstat64(3, {st_mode=S_IFREG|0755, st_size=1102984, ...}) = 0 > old_mmap(NULL, 1112740, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = > 0x40021000 > mprotect(0x40129000, 31396, PROT_NONE) = 0 > old_mmap(0x40129000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, > 3, 0x107000) = 0x40129000 > old_mmap(0x4012f000, 6820, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4012f000 > close(3) = 0 > old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, > -1, 0) = 0x40131000 > munmap(0x40012000, 57677) = 0 > open("/var/tmp/testopen.txt", O_RDONLY|O_DIRECT) = 3 > brk(0) = 0x80497fc > brk(0x804c7fc) = 0x804c7fc > brk(0) = 0x804c7fc > brk(0x804d000) = 0x804d000 > read(3, "", 4096) = 0 > fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 4), ...}) = 0 > old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, > -1, 0) = 0x40012000 > write(1, "0 bytes read from file.\n", 240 bytes read from file. > ) = 24 > close(3) = 0 > write(1, "Message: ", 9Message: ) = 9 > munmap(0x40012000, 4096) = 0 > exit_group(0) = ? > > Thanks a lot, > > Bruno. > > > > > > So the question remains, am I able to read just files whose size is > > > a multiple of block size? > > > > No. > > > > You ideally should be able to read any length file with O_DIRECT. > > Even a 1-byte file. > > > > > > > > --cw -- Bruno Diniz de Paula <diniz@cs.rutgers.edu> Rutgers University [unhandled content-type:application/pgp-signature] | |