Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Illegal seek error with seek() and os.lseek()

506 views
Skip to first unread message

krishna...@gmail.com

unread,
May 14, 2013, 3:00:22 PM5/14/13
to
I am trying to use os.open() and os.lseek() methods to operate on a device file in Linux. My code goes something like this -

# first, open the file as a plain binary
try:
self.file = open(/dev/relpcfpga, "r+b", buffering=0)

except IOError:
raise IOError ('Failed to open.')

# Figure out file size
self.file.seek(0, 2)
self.file_size = self.file.tell()


The method seek() complains "OSError: [Errno 29] Illegal seek"
The device relpcfpga is a char device.

The same code works with a normal text file.
I have tried to use os.open() and os.lseek() methods, but see the same error.
Is there a different method to operate on device files?


Thanks!

mar...@python.net

unread,
May 14, 2013, 4:00:44 PM5/14/13
to pytho...@python.org
Some file streams are not seekable. Specifically, some (all?) char
devices aren't seekable (because e.g. they can't be rewound or they have
no end). You'd get the same error in C (well it would return -1).

See also: http://www.linuxintro.org/wiki/Device

Roy Smith

unread,
May 14, 2013, 4:02:16 PM5/14/13
to
In article <50bf9366-46e0-4a7f...@googlegroups.com>,
In general, seek() works on special files, when it makes sense. But,
the "in general" part is critical. Not all devices support the seek
operation. I have no idea what /dev/relpcfpga is (a google search for
relpcfpga came up with exactly one hit -- your post!) so I can't tell
you if it supports seek() or not.

Andreas Perstinger

unread,
May 14, 2013, 4:12:23 PM5/14/13
to pytho...@python.org
On 14.05.2013 21:00, krishna...@gmail.com wrote:
> # first, open the file as a plain binary
> try:
> self.file = open(/dev/relpcfpga, "r+b", buffering=0)

Aren't you missing the quotes for "/dev/relpcfpga"?

> The method seek() complains "OSError: [Errno 29] Illegal seek"
> The device relpcfpga is a char device.

Are you sure that your device is seekable?
Try

f = open("/dev/relpcfpga", "r+b", buffering=0)
print(f.seekable())

Bye, Andreas
0 new messages