[Main]
Read System Call
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
ssize_t
read(int d, void *buf, size_t nbytes)
ssize_t
readv(int d, const struct iovec *iov, int iovcnt)
ssize_t
pread(int d, void *buf, size_t nbytes, off_t offset)
DESCRIPTION
Read() attempts to read nbytes of data from the object referenced by the
descriptor d into the buffer pointed to by buf. Readv() performs the same
action, but scatters the input data into the iovcnt buffers specified by
the members of the iov array: iov[0], iov[1], ..., iov[iovcnt-1].
Pread() performs the same function, but reads from the specified position
in the file without modifying the file pointer.
For readv(), the iovec structure is defined as:
struct iovec {
char *iov_base; /* Base address. */
size_t iov_len; /* Length. */
};
Each iovec entry specifies the base address and length of an area in mem-
ory where data should be placed. Readv() will always fill an area com-
pletely before proceeding to the next.
On objects capable of seeking, the read() starts at a position given by
the pointer associated with d (see lseek(2)). Upon return from read(),
the pointer is incremented by the number of bytes actually read.
Objects that are not capable of seeking always read from the current po-
sition. The value of the pointer associated with such an object is unde-
fined.
Upon successful completion, read(), readv(), and pread() return the num-
ber of bytes actually read and placed in the buffer. The system guaran-
tees to read the number of bytes requested if the descriptor references a
normal file that has that many bytes left before the end-of-file, but in
no other case.
IMPLEMENTATION NOTES
In the non-threaded library read() is implemented as the read syscall.
In the threaded library, the read syscall is assembled to
_thread_sys_read() and read() is implemented as a function which locks d
for read, then calls _thread_sys_read(). If the call to
global variable errno is set to indicate the error.
ERRORS
Read(), readv(), and pread() will succeed unless:
[EBADF] D is not a valid file or socket descriptor open for read-
ing.
[EFAULT] Buf points outside the allocated address space.
[EIO] An I/O error occurred while reading from the file system.
[EINTR] A read from a slow device was interrupted before any data
arrived by the delivery of a signal.
[EINVAL] The pointer associated with d was negative.
[EAGAIN] The file was marked for non-blocking I/O, and no data were
ready to be read.
In addition, readv() may return one of the following errors:
[EINVAL] Iovcnt was less than or equal to 0, or greater than 16.
[EINVAL] One of the iov_len values in the iov array was negative.
[EINVAL] The sum of the iov_len values in the iov array overflowed a
32-bit integer.
[EFAULT] Part of the iov points outside the process's allocated ad-
dress space.
The pread() call may also return the following errors:
[EINVAL] The specified file offset is invalid.
[ESPIPE] The file descriptor is associated with a pipe, socket, or
FIFO.
STANDARDS
The read() function call is expected to conform to IEEE Std1003.1-1990
(``POSIX''). The readv() and pread() functions are expected to conform to
X/Open Portability Guide Issue 4.2 (``XPG4.2'').
HISTORY
The pread() function call appeared in AT&T System V.4 UNIX. The readv()
function call appeared in 4.2BSD. A read() function call appeared in Ver-
sion 6 AT&T UNIX.