Caution: This version of this document is no longer maintained. For the latest documentation, see http://www.qnx.com/developers/docs.

write()

Write bytes to a file

Synopsis:

#include <unistd.h>

ssize_t write( int fildes,
               const void* buf,
               size_t nbyte );

Arguments:

fildes
The file descriptor for the file you want to write in.
buf
A pointer to a buffer that contains the data you want to write.
nbyte
The number of bytes to write.

Library:

libc

Use the -l c option to qcc to link against this library. This library is usually included automatically.

Description:

The write() function attempts to write nbyte bytes to the file associated with the open file descriptor, fildes, from the buffer pointed to by buf.

If nbyte is zero, write() returns zero, and has no other effect.

On a regular file or other file capable of seeking, and if O_APPEND isn't set, write() starts at a position in the file given by the file offset associated with fildes. If O_APPEND is set, the file offset is set to the end of file before each write operation. Before successfully returning from write(), the file offset is incremented by the number of bytes actually written. On a regular file, if this incremented file offset is greater than the length of the file, the length of the file is set to this file offset.


Note: Note that the write() call ignores advisory locks that may have been set by the fcntl() function.

On a file not capable of seeking, write() starts at the current position.

If write() requests that more bytes be written than there's room for (for example, all blocks on a disk are already allocated), only as many bytes as there's room for are written. For example, if there's only room for 80 more bytes in a file, a write of 512 bytes would return 80. The next write of a nonzero number of bytes would give a failure return (except as noted below).

When write() returns successfully, its return value is the number of bytes actually written to the file. This number is never greater then nbyte, although it may be less than nbyte under certain circumstances detailed below.

If write() is interrupted by a signal before it has written any data, it returns a value of -1, and errno is set to EINTR. However, if write() is interrupted by a signal after it has successfully written some data, it returns the number of bytes written.

If the value of nbyte is greater than INT_MAX, write() returns -1 and sets errno to EINVAL. See <limits.h>.

Write requests to a pipe (or FIFO) are handled the same as a regular file, with the following exceptions:

When attempting to write to a file (other than a pipe or FIFO) that supports nonblocking writes and can't accept the data immediately:

If write() is called with the file offset beyond the end-of-file, the file is extended to the current file offset with the intervening bytes filled with zeroes. This is a useful technique for pregrowing a file.

If write() succeeds, the st_ctime and st_mtime fields of the file are marked for update.

Returns:

The number of bytes written, or -1 if an error occurred (errno is set).

Errors:

EAGAIN
The O_NONBLOCK flag is set for the file descriptor, and the process would be delayed in the write operation.
EBADF
The file descriptor, fildes, isn't a valid file descriptor open for writing.
EFBIG
The file is a regular file, where nbytes is greater than 0, and the starting position is greater than or equal to the offset maximum associated with the file.
EINTR
The write operation was interrupted by a signal, and either no data was transferred, or the resource manager responsible for that file doesn't report partial transfers.
EIO
A physical I/O error occurred (for example, a bad block on a disk). The precise meaning is device-dependent.
ENOSPC
There's no free space remaining on the device containing the file.
ENOSYS
The write() function isn't implemented for the filesystem specified by filedes.
EPIPE
An attempt was made to write to a pipe (or FIFO) that isn't open for reading by any process. A SIGPIPE signal is also sent to the process.

Examples:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>

char buffer[] = { "A text record to be written" };

int main( void )
{
    int  fd;
    int  size_written;

    /* open a file for output          */
    /* replace existing file if it exists */
    fd = creat( "myfile.dat", S_IRUSR | S_IWUSR );

    /* write the text              */
    size_written = write( fd, buffer,
              sizeof( buffer ) );

    /* test for error              */
    if( size_written != sizeof( buffer ) ) {
        perror( "Error writing myfile.dat" );
        return EXIT_FAILURE;
    }

    /* close the file              */
    close( fd );

    return EXIT_SUCCESS;
}

Classification:

POSIX 1003.1 XSI

Safety:
Cancellation point Yes
Interrupt handler No
Signal handler Yes
Thread Yes

See also:

close(), creat(), dup(), dup2(), errno, fcntl(), lseek(), open(), pipe(), read(), readv(), select(), writev()