Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

dup(2)

fcntl(2V)

intro(2)

ioctl(2)

lseek(2)

open(2V)

pipe(2)

select(2)

sigvec(2)

signal(3V)

WRITE(2V)  —  SYSTEM CALLS

NAME

write, writev − write output

SYNOPSIS

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

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

int writev(d, iov, iovcnt)
int 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. 

For regular files, if the O_SYNC flag of the file status flags is set, the write will not return until both the file data and file status have been physically updated.  This function is for special applications that require extra reliability at the cost of performance.  For block special files, if O_SYNC is set, the write will not return until the data has been physically updated. 

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. 

For STREAMS (see intro(2)) files, the operation of write() and writev() are determined by the values of the minimum and maximum packet sizes accepted by the stream. These values are contained in the topmost stream module.  Unless the user pushes (see I_PUSH in streamio(4)) the topmost module, these values can not be set or tested from user level.  If the total number of bytes to be written falls within the packet size range, that many bytes will be written.  If the total number of bytes to be written does not fall within the range and the minimum packet size value is zero, write() and writev() will break the data to be written into maximum packet size segments prior to sending the data downstream (the last segment may contain less than the maximum packet size).  If the total number of bytes to be written does not fall within the range and the minimum value is non-zero, write() and writev() will fail with errno set to ERANGE.  Writing a zero-length buffer (the total number of bytes to be written is zero) sends zero bytes with zero returned. 

When a descriptor or the object it refers to is marked for non-blocking I/O, and the descriptor refers to an object subject to flow control, such as a socket, a pipe (or FIFO), or a stream, 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:

• If the object the descriptor is associated with is marked for 4.2BSD-style non-blocking I/O (with the FIONBIO ioctl(2), or an fcntl() using the FNDELAY flag from <sys/file.h> or the O_NDELAY flag from <sys/fcntl.h> in the 4.2BSD environment), the write will return −1 and errno will be set to EWOULDBLOCK. 

• If the descriptor is marked for System V-style non-blocking I/O (with an fcntl() using the FNBIO flag from <sys/file.h> or the O_NDELAY flag from <sys/fcntl.h> in the System V environment), and does not refer to a stream, the write will return 0.

• If the descriptor is marked for System V-style non-blocking I/O, and refers to a stream, the write will return −1 and errno will be set to EAGAIN. 

• If neither the descriptor nor the object it refers to are marked for non-blocking I/O, the write will block until space becomes available. 

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 receive 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 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 stream is linked below a multiplexor. 

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. 

ENXIO A hangup occurred on the stream being written to. 

ERANGE d refers to a stream, the total number of bytes to be written is outside the minimum and maximum write range, and the minimum value is non-zero.

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

EAGAIN The descriptor referred to a stream, was marked for System V-style 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. 

A write to a STREAMS file can fail if an error message has been received at the stream head.  In this case, errno is set to the value included in the error message. 

SEE ALSO

dup(2), fcntl(2V), intro(2), ioctl(2), lseek(2), open(2V), pipe(2), select(2), sigvec(2), signal(3V)

Sun Release 4.0  —  Last change: 20 November 1987

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