123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- .\" Copyright (c) 1980, 1991, 1993
- .\" The Regents of the University of California. All rights reserved.
- .\"
- .\" Redistribution and use in source and binary forms, with or without
- .\" modification, are permitted provided that the following conditions
- .\" are met:
- .\" 1. Redistributions of source code must retain the above copyright
- .\" notice, this list of conditions and the following disclaimer.
- .\" 2. Redistributions in binary form must reproduce the above copyright
- .\" notice, this list of conditions and the following disclaimer in the
- .\" documentation and/or other materials provided with the distribution.
- .\" 3. Neither the name of the University nor the names of its contributors
- .\" may be used to endorse or promote products derived from this software
- .\" without specific prior written permission.
- .\"
- .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- .\" SUCH DAMAGE.
- .\"
- .Dd July 13, 2020
- .Dt LSEEK 2
- .Os
- .Sh NAME
- .Nm lseek
- .Nd reposition read/write file offset
- .Sh LIBRARY
- .Lb libc
- .Sh SYNOPSIS
- .In unistd.h
- .Ft off_t
- .Fn lseek "int fildes" "off_t offset" "int whence"
- .Sh DESCRIPTION
- The
- .Fn lseek
- system call repositions the offset of the file descriptor
- .Fa fildes
- to the
- argument
- .Fa offset
- according to the directive
- .Fa whence .
- The argument
- .Fa fildes
- must be an open
- file descriptor.
- The
- .Fn lseek
- system call
- repositions the file position pointer associated with the file
- descriptor
- .Fa fildes
- as follows:
- .Bl -item -offset indent
- .It
- If
- .Fa whence
- is
- .Dv SEEK_SET ,
- the offset is set to
- .Fa offset
- bytes.
- .It
- If
- .Fa whence
- is
- .Dv SEEK_CUR ,
- the offset is set to its current location plus
- .Fa offset
- bytes.
- .It
- If
- .Fa whence
- is
- .Dv SEEK_END ,
- the offset is set to the size of the
- file plus
- .Fa offset
- bytes.
- .It
- If
- .Fa whence
- is
- .Dv SEEK_HOLE ,
- the offset is set to the start of the next hole greater than or equal
- to the supplied
- .Fa offset .
- The definition of a hole is provided below.
- .It
- If
- .Fa whence
- is
- .Dv SEEK_DATA ,
- the offset is set to the start of the next non-hole file region greater
- than or equal to the supplied
- .Fa offset .
- .El
- .Pp
- The
- .Fn lseek
- system call allows the file offset to be set beyond the end
- of the existing end-of-file of the file.
- If data is later written
- at this point, subsequent reads of the data in the gap return
- bytes of zeros (until data is actually written into the gap).
- However, the
- .Fn lseek
- system call does not, by itself, extend the size of a file.
- .Pp
- A
- .Qq hole
- is defined as a contiguous range of bytes in a file, all having the value of
- zero, but not all zeros in a file are guaranteed to be represented as holes
- returned with
- .Dv SEEK_HOLE .
- File systems are allowed to expose ranges of zeros with
- .Dv SEEK_HOLE ,
- but not required to.
- Applications can use
- .Dv SEEK_HOLE
- to optimise their behavior for ranges of zeros, but must not depend on it to
- find all such ranges in a file.
- Each file is presented as having a zero-size virtual hole at the very
- end of the file.
- The existence of a hole at the end of every data region allows for easy
- programming and also provides compatibility to the original implementation
- in Solaris.
- It also causes the current file size (i.e., end-of-file offset) to be returned
- to indicate that there are no more holes past the supplied
- .Fa offset .
- Applications should use
- .Fn fpathconf _PC_MIN_HOLE_SIZE
- or
- .Fn pathconf _PC_MIN_HOLE_SIZE
- to determine if a file system supports
- .Dv SEEK_HOLE .
- See
- .Xr pathconf 2 .
- .Pp
- For file systems that do not supply information about holes, the file will be
- represented as one entire data region.
- .Sh RETURN VALUES
- Upon successful completion,
- .Fn lseek
- returns the resulting offset location as measured in bytes from the
- beginning of the file.
- Otherwise,
- a value of -1 is returned and
- .Va errno
- is set to indicate
- the error.
- .Sh ERRORS
- The
- .Fn lseek
- system call
- will fail and the file position pointer will remain unchanged if:
- .Bl -tag -width Er
- .It Bq Er EBADF
- The
- .Fa fildes
- argument
- is not an open file descriptor.
- .It Bq Er EINVAL
- The
- .Fa whence
- argument
- is not a proper value
- or the resulting file offset would
- be negative for a non-character special file.
- .It Bq Er ENXIO
- For
- .Dv SEEK_DATA ,
- there are no more data regions past the supplied offset.
- Due to existence of the hole at the end of the file, for
- .Dv SEEK_HOLE
- this error is only returned when the
- .Fa offset
- already points to the end-of-file position.
- .It Bq Er EOVERFLOW
- The resulting file offset would be a value which cannot be represented
- correctly in an object of type
- .Fa off_t .
- .It Bq Er ESPIPE
- The
- .Fa fildes
- argument
- is associated with a pipe, socket, or FIFO.
- .El
- .Sh SEE ALSO
- .Xr dup 2 ,
- .Xr open 2 ,
- .Xr pathconf 2
- .Sh STANDARDS
- The
- .Fn lseek
- system call is expected to conform to
- .St -p1003.1-2008 .
- .Pp
- The
- .Dv SEEK_HOLE
- and
- .Dv SEEK_DATA
- directives, along with the
- .Er ENXIO
- error, are extensions to that specification.
- .Sh HISTORY
- The
- .Fn lseek
- function appeared in
- .At v7 .
- .Sh BUGS
- If the
- .Fn lseek
- system call is operating on a device which is incapable of seeking,
- it will request the seek operation and return successfully,
- even though no seek was performed.
- Because the
- .Ar offset
- argument will be stored unconditionally in the file descriptor of that device,
- there is no way to confirm if the seek operation succeeded or not
- (e.g. using the
- .Fn ftell
- function).
- Device types which are known to be incapable of seeking include
- tape drives.
- .Pp
- The
- .Fn lseek
- system call will not detect whether media are present in changeable
- media devices such as DVD or Blu-ray devices.
- A requested seek operation will therefore return sucessfully when no
- medium is present.
- .Pp
- This document's use of
- .Fa whence
- is incorrect English, but is maintained for historical reasons.
|