Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

fcntl(2)

lseek(2)

open(2V)

pipe(2)

select(2)

WRITE(2V)  —  SYSTEM CALLS

NAME

write, writev − write output

SYNOPSIS

cc = write(d, buf, nbytes)
int cc, d;
char ∗buf;
int nbytes;

#include <sys/types.h>
#include <sys/uio.h>

cc = writev(d, iov, iovcnt)
int cc, d;
struct iovec ∗iov;
int iovcnt;

DESCRIPTION

write attempts to write nbytes of data to the object referenced by the descriptor d from the buffer pointed to by buf. writev 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].

For writev, the iovec structure is defined as

struct iovec {
caddr_tiov_base;
intiov_len;
};

Each iovec entry specifies the base address and length of an area in memory from which data should be written.  writev 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 actually 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 O_APPEND flag of the file status flags is set, the file pointer will be set to the end of the file prior to each write. 

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 that are subject to flow control, such as sockets, pipes (or FIFOs), or terminals, 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.  If such an object’s buffers are full, so that it cannot accept any data, then write and writev will return −1 and set errno to EWOULDBLOCK.  Otherwise, they will block until space becomes available. 

SYSTEM V DESCRIPTION

A write (but not a writev) on an object that cannot accept any data will return a count of 0, rather than returning−1 and setting errno to EWOULDBLOCK. 

RETURN VALUE

Upon successful completion the number of bytes actually writen is returned.  Otherwise a −1 is returned and the global variable errno is set to indicate the error. 

ERRORS

write and writev will fail and the file pointer will remain unchanged if one or more of the following are true:

EBADF d is not a valid descriptor open for writing. 

EPIPE An attempt is made to write to a pipe that is not open for reading by any process (or to a socket of type SOCK_STREAM that is connected to a peer socket.)  Note: an attempted write of this kind will also cause you to recieve a SIGPIPE signal from the kernel.  If you’ve not made a special provision to catch or ignore this signal, your process will die. 

EFBIG An attempt was made to write a file that exceeds the process’s file size limit or the maximum file size. 

EFAULT Part of iov or data to be written to the file points outside the process’s allocated address space. 

The call is forced to terminate prematurely due to the arrival of a signal whose.SM SV_INTERRUPT
bit in sv_flags is set  (see sigvec(2)). signal(3V), in the System V compatibility library, sets this bit for any signal it catches.

EINVAL The pointer associated with d was negative. 

ENOSPC There is no free space remaining on the file system containing the file. 

EDQUOT The user’s quota of disk blocks on the file system containing the file has been exhausted. 

EIO An I/O error occurred while reading from or writing to the file system. 

EWOULDBLOCK
The file was marked for non-blocking I/O, and no data could be written immediately.

In addition, writev 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. 

SEE ALSO

fcntl(2), lseek(2), open(2V), pipe(2), select(2)

Sun Release 3.2  —  Last change: 16 July 1986

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026