Just as you can set the file position of a stream with fseek
, you
can set the file position of a descriptor with lseek
. This
specifies the position in the file for the next read
or
write
operation. See section File Positioning, for more information
on the file position and what it means.
To read the current file position value from a descriptor, use
lseek (desc, 0, SEEK_CUR)
.
lseek
function is used to change the file position of the
file with descriptor filedes.
The whence argument specifies how the offset should be
interpreted in the same way as for the fseek
function, and must be
one of the symbolic constants SEEK_SET
, SEEK_CUR
, or
SEEK_END
.
SEEK_SET
SEEK_CUR
SEEK_END
lseek
is normally the resulting file
position, measured in bytes from the beginning of the file.
You can use this feature together with SEEK_CUR
to read the
current file position.
If you want to append to the file, setting the file position to the
current end of file with SEEK_END
is not sufficient. Another
process may write more data after you seek but before you write,
extending the file so the position you write onto clobbers their data.
Instead, use the O_APPEND
operating mode; see section I/O Operating Modes.
You can set the file position past the current end of the file. This
does not by itself make the file longer; lseek
never changes the
file. But subsequent output at that position will extend the file.
Characters between the previous end of file and the new position are
filled with zeros. Extending the file in this way can create a
"hole": the blocks of zeros are not actually allocated on disk, so the
file takes up less space than it appears so; it is then called a
"sparse file".
If the file position cannot be changed, or the operation is in some way
invalid, lseek
returns a value of -1
. The following
errno
error conditions are defined for this function:
EBADF
EINVAL
ESPIPE
ESPIPE
if the object is not seekable.)
lseek
function is the underlying primitive for the
fseek
, ftell
and rewind
functions, which operate on
streams instead of file descriptors.
dup
.
Descriptors that come from separate calls to open
have independent
file positions; using lseek
on one descriptor has no effect on the
other. For example,
{ int d1, d2; char buf[4]; d1 = open ("foo", O_RDONLY); d2 = open ("foo", O_RDONLY); lseek (d1, 1024, SEEK_SET); read (d2, buf, 4); }will read the first four characters of the file `foo'. (The error-checking code necessary for a real program has been omitted here for brevity.) By contrast, descriptors made by duplication share a common file position with the original descriptor that was duplicated. Anything which alters the file position of one of the duplicates, including reading or writing data, affects all of them alike. Thus, for example,
{ int d1, d2, d3; char buf1[4], buf2[4]; d1 = open ("foo", O_RDONLY); d2 = dup (d1); d3 = dup (d2); lseek (d3, 1024, SEEK_SET); read (d1, buf1, 4); read (d2, buf2, 4); }will read four characters starting with the 1024'th character of `foo', and then four more characters starting with the 1028'th character.
fpos_t
or long int
.
L_SET
SEEK_SET
.
L_INCR
SEEK_CUR
.
L_XTND
SEEK_END
.
Go to the first, previous, next, last section, table of contents.