The
write
system call
attempts to write
nbytes
of data to the object referenced by the descriptor
d
from the buffer pointed to by
buf.
The
writev
system call
performs the same action, but gathers the output data
from the
iovcnt
buffers specified by the members of the
iov
array: iov[0], iov[1], ..., iov[iovcnt-1].
The
pwrite
and
pwritev
system calls
perform the same functions, but write to the specified position in
the file without modifying the file pointer.
For
writev
and
pwritev,
the
iovec
structure is defined as:
struct iovec {
void *iov_base; /* Base address. */
size_t iov_len; /* Length. */
};
Each
iovec
entry specifies the base address and length of an area
in memory from which data should be written.
The
writev
system call
will always write a complete area before proceeding
to the next.
On objects capable of seeking, the
write
starts at a position
given by the pointer associated with
d,
see
lseek(2).
Upon return from
write,
the pointer is incremented by the number of bytes which were written.
Objects that are not capable of seeking always write from the current
position.
The value of the pointer associated with such an object
is undefined.
If the real user is not the super-user, then
write
clears the set-user-id bit on a file.
This prevents penetration of system security
by a user who
"captures"
a writable set-user-id file
owned by the super-user.
When using non-blocking I/O on objects such as sockets that are subject
to flow control,
write
and
writev
may write fewer bytes than requested;
the return value must be noted,
and the remainder of the operation should be retried when possible.