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

K

krishna2prasad

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!
 
M

marduk

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?

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
 
R

Roy Smith

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?

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.
 
A

Andreas Perstinger

# 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
 

Ask a Question

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.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,015
Latest member
AmbrosePal

Latest Threads

Top