D
Dan Stromberg
Is there a way of setting O_DIRECT on a preexisting file like sys.stdin?
Does C allow this sort of thing?
Thanks!
Does C allow this sort of thing?
Thanks!
Does C allow this sort of thing?
[quoted text muted]
There is no O_DIRECT or fcntl() in Standard C.
fcntl() operates on an open file descriptor, and the file descriptor
for stdin is 0. Two calls to fcntl(), one with F_GETFL and one
with F_SETFL, would do what you want.
I'm not sure why you want to do that, though. It's not going to
get you character-at-a-time I/O, if that's what you want.
Gordon L. Burditt
impact on the system's buffer cache.
I'm trying:
if hasattr(os, 'O_DIRECT'):
try:
flags = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL)
flags |= os.O_DIRECT
fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, flags)
except:
sys.stderr.write('Setting O_DIRECT on stdin attempted but failed\n')
else:
sys.stderr.write('Setting O_DIRECT on stdin succeeded\n')
...but while this code doesn't error out, I get:
seki-root> reblock -e $[1024*1024*80] $[1024*1024] 300 < /dev/sda1 > /dev/null
stdin seems seekable, but file length is 0 - no exact percentages
Estimated filetransfer size is 85899345920 bytes
Estimated percentages will only be as accurate as your size estimate
Setting O_DIRECT on stdin succeeded
Traceback (most recent call last):
File "/Dcs/seki/strombrg/bin/reblock", line 276, in ?
main()
File "/Dcs/seki/strombrg/bin/reblock", line 222, in main
block = os.read(0,blocksize)
OSError: [Errno 22] Invalid argument
Mon Nov 07 12:25:53
...but if I comment out the fcntl/O_DIRECT code, then the same thing works
well.
Any other ideas folks?
[quoted text muted]
Does O_DIRECT perhaps invoke some of the restrictions of "raw"
device files, where the current offset and transfer size must be a
multiple of some block size? (I don't see any mention of that in
FreeBSD's documentation.) What is the value of blocksize at the
time of the traceback above? I suggest keeping it well under 2G.
Gordon L. Burditt
Here's some text from my open(2) manpage:
Transfer sizes, and the alignment of user buffer and file offset must
all
be multiples of the logical block size of the file system.
It's unlikely that in practice you can get Python's sys.stdin.read() or
os.read() to reliably use a buffer that fits the alignment restriction.
Gordon Burditt said:[snip]I want to be able to read a HUGE file without having such a negative
impact on the system's buffer cache.
Does O_DIRECT perhaps invoke some of the restrictions of "raw"
device files, where the current offset and transfer size must be a
multiple of some block size?
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.