Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ read(2) — NEWS-os 5.0.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

intro(2)

creat(2)

dup(2)

fcntl(2)

getmsg(2)

ioctl(2)

open(2)

pipe(2)

streamio(7)

termio(7)



read(2)                   SYSTEM CALLS                    read(2)



NAME
     read - read from file

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

     int read(int fildes, void *buf, unsigned nbyte);

     int readv(int fildes, struct iovec *iov, int iovcnt);

DESCRIPTION
     read attempts to read nbyte bytes from the  file  associated
     with  fildes into the buffer pointed to by buf.  If nbyte is
     zero, read returns zero and has no other results.  fildes is
     a  file  descriptor obtained from a creat, open, dup, fcntl,
     or pipe system call.

     On devices capable of seeking, the read starts at a position
     in  the  file  given  by  the  file  pointer associated with
     fildes.  On return from read, the  file  pointer  is  incre-
     mented by the number of bytes actually read.

     Devices that are incapable of seeking always read  from  the
     current  position.   The  value of a file pointer associated
     with such a file is undefined.

     readv performs the same action as read, but places the input
     data into the iovcnt buffers specified by the members of the
     iov array: iov[0], iov[1], ..., iov[iovcnt-1].   For  readv,
     the iovec structure contains the following members:
          addrt    iovbase;
          sizet    iovlen;
     Each iovec entry specifies the base address and length of an
     area  in  memory  where  data should be placed. readv always
     fills one buffer completely before proceeding to the next.

     On success, read and readv return the number of bytes  actu-
     ally  read and placed in the buffer; this number may be less
     than nbyte if the file is associated  with  a  communication
     line [see ioctl(2) and termio(7)], or if the number of bytes
     left in the file is less than nbyte, or if  the  file  is  a
     pipe  or  a  special file.  A value of 0 is returned when an
     end-of-file has been reached.

     read reads data previously written to a file. If any portion
     of  an  ordinary  file prior to the end of file has not been
     written, read returns the number of bytes  read  as  0.  For
     example, the lseek routine allows the file pointer to be set
     beyond the end of existing data in the file.  If  additional
     data  is  written at this point, subsequent reads in the gap



                                                                1





read(2)                   SYSTEM CALLS                    read(2)



     between the previous end of  data  and  newly  written  data
     return  bytes  with  a value of 0 until data is written into
     the gap.

     A read or readv from  a  STREAMS  [see  intro(2)]  file  can
     operate   in   three   different  modes:  byte-stream  mode,
     message-nondiscard  mode,  and  message-discard  mode.   The
     default  is byte-stream mode.  This can be changed using the
     ISRDOPT ioctl(2) request  [see  streamio(7)],  and  can  be
     tested  with  the IGRDOPT ioctl(2) request.  In byte-stream
     mode, read and readv usually retrieve data from  the  stream
     until  they have retrieved nbyte bytes, or until there is no
     more data to be retrieved.  Byte-stream mode usually ignores
     message boundaries.

     In STREAMS message-nondiscard mode, read and readv  retrieve
     data until they have read nbyte bytes, or until they reach a
     message boundary.  If read or readv does  not  retrieve  all
     the data in a message, the remaining data is replaced on the
     stream and can be retrieved by the next read or readv  call.
     Message-discard  mode  also  retrieves  data  until  it  has
     retrieved nbyte bytes, or it  reaches  a  message  boundary.
     However,  unread  data remaining in a message after the read
     or readv returns is discarded, and is not  available  for  a
     subsequent read, readv, or getmsg [see getmsg(2)].

     When attempting to read from a regular file  with  mandatory
     file/record locking set [see chmod(2)], and there is a write
     lock owned by another process on the segment of the file  to
     be read:

          If ONDELAY or ONONBLOCK is set, read returns  -1  and
          sets errno to EAGAIN.

          If ONDELAY and ONONBLOCK are clear, read sleeps until
          the blocking record lock is removed.

     When attempting to read from an empty pipe (or FIFO):

          If no process has  the  pipe  open  for  writing,  read
          returns 0 to indicate end-of-file.

          If some process has  the  pipe  open  for  writing  and
          ONDELAY is set, read returns 0.

          If some process has  the  pipe  open  for  writing  and
          ONONBLOCK  is  set,  read returns -1 and sets errno to
          EAGAIN.

          If ONDELAY and ONONBLOCK are clear, read blocks until
          data  is  written  to the pipe or the pipe is closed by
          all processes that had opened the pipe for writing.



                                                                2





read(2)                   SYSTEM CALLS                    read(2)



     When attempting to read a file associated  with  a  terminal
     that has no data currently available:

          If ONDELAY is set, read returns 0.

          If ONONBLOCK is set, read returns -1 and sets errno to
          EAGAIN.

          If ONDELAY and ONONBLOCK are clear, read blocks until
          data becomes available.

     When attempting to read a file associated with a stream that
     is  not  a  pipe  or FIFO, or terminal, and that has no data
     currently available:

          If ONDELAY or ONONBLOCK is set, read returns  -1  and
          sets errno to EAGAIN.

          If ONDELAY and ONONBLOCK are clear, read blocks until
          data becomes available.

     When reading from a STREAMS file, handling of zero-byte mes-
     sages  is  determined  by the current read mode setting.  In
     byte-stream mode, read accepts data until it has read  nbyte
     bytes,  or  until  there is no more data to read, or until a
     zero-byte message block is encountered.  read  then  returns
     the  number  of bytes read, and places the zero-byte message
     back on the stream to be  retrieved  by  the  next  read  or
     getmsg [see getmsg(2)].  In the two other modes, a zero-byte
     message returns a value of 0 and the message is removed from
     the  stream.   When a zero-byte message is read as the first
     message on a stream, a value of 0 is returned regardless  of
     the read mode.

     A read or readv from a STREAMS file returns the data in  the
     message  at the front of the stream head read queue, regard-
     less of the priority band of the message.

     Normally, a read from a STREAMS file can only  process  mes-
     sages  with  data and without control information.  The read
     fails if a message containing control information is encoun-
     tered  at  the  stream  head.   This  default  action can be
     changed by placing the stream in either control-data mode or
     control-discard   mode   with  the  ISRDOPT  ioctl(2).   In
     control-data mode, control messages are  converted  to  data
     messages by read.  In control-discard mode, control messages
     are discarded by read, but any data associated with the con-
     trol messages is returned to the user.

     read and readv fail if one or  more  of  the  following  are
     true:




                                                                3





read(2)                   SYSTEM CALLS                    read(2)



     EAGAIN         Mandatory  file/record   locking   was   set,
                    ONDELAY or ONONBLOCK was set, and there was
                    a blocking record lock.

     EAGAIN         Total amount of system memory available  when
                    reading  via  raw I/O is temporarily insuffi-
                    cient.

     EAGAIN         No data is waiting to be read on a file asso-
                    ciated  with  a tty device and ONONBLOCK was
                    set.

     EAGAIN         No message is waiting to be read on a  stream
                    and ONDELAY or ONONBLOCK was set.

     EBADF          fildes is not a valid  file  descriptor  open
                    for reading.

     EBADMSG        Message waiting to be read on a stream is not
                    a data message.

     EDEADLK        The read was going to go to sleep and cause a
                    deadlock to occur.

     EFAULT         buf  points  outside  the  allocated  address
                    space.

     EINTR          A signal was caught during the read or  readv
                    system call.

     EINVAL         Attempted to read from a stream linked  to  a
                    multiplexor.

     EIO            A physical I/O error  has  occurred,  or  the
                    process  is in a background process group and
                    is attempting to read  from  its  controlling
                    terminal,  and either the process is ignoring
                    or blocking the SIGTTIN signal or the process
                    group of the process is orphaned.

     ENOLCK         The system record lock table was full, so the
                    read or readv could not go to sleep until the
                    blocking record lock was removed.

     ENOLINK        fildes is on a remote machine and the link to
                    that machine is no longer active.

     ENXIO          The device associated with fildes is a  block
                    special  or  character  special  file and the
                    value of the file pointer is out of range.





                                                                4





read(2)                   SYSTEM CALLS                    read(2)



     In addition, readv may return one of the following errors:

     EFAULT         iov  points  outside  the  allocated  address
                    space.

     EINVAL         iovcnt was less than or equal to 0 or greater
                    than 16.

     EINVAL         The sum of the  iovlen  values  in  the  iov
                    array overflowed a 32-bit integer.

     A read from a STREAMS file also fails if an error message is
     received  at the stream head.  In this case, errno is set to
     the value returned in the error message.  If a hangup occurs
     on the stream being read, read continues to operate normally
     until the stream head read queue is empty.   Thereafter,  it
     returns 0.

SEE ALSO
     intro(2), creat(2), dup(2), fcntl(2),  getmsg(2),  ioctl(2),
     open(2), pipe(2)
     streamio(7), termio(7) in the System Administrator's  Refer-
     ence Manual

DIAGNOSTICS
     On success a non-negative integer is returned indicating the
     number  of bytes actually read.  Otherwise, a -1 is returned
     and errno is set to indicate the error.



























                                                                5



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