Advanced Programming in the UNIX® Environment

(lily) #1
ptg10805159

64 File I/O Chapter 3


O_TTY_INIT When opening a terminal device that is not already open, set the
nonstandardtermiosparameters to values that result in behavior that
conforms to the Single UNIX Specification. We discuss thetermios
structurewhen we discuss terminal I/O in Chapter 18.

The following two flags arealso optional. They arepart of the synchronized input and
output option of the Single UNIX Specification (and thus POSIX.1).

O_DSYNC Have eachwritewait for physical I/O to complete, but don’t wait for
file attributes to be updated if they don’t affect the ability to read the
data just written.

TheO_DSYNCandO_SYNCflags aresimilar,but subtly different. TheO_DSYNCflag
affects a file’s attributes only when they need to be updated to reflect a change in the
file’s data (for example, update the file’s size to reflect moredata). With theO_SYNC
flag, data and attributes arealways updated synchronously.When overwriting an
existing part of a file opened with theO_DSYNCflag, the file times wouldn’t be
updated synchronously.Incontrast, if we had opened the file with theO_SYNCflag,
everywriteto the file would update the file’s times beforethewritereturns,
regardless of whether we werewriting over existing bytes or appending to the file.

O_RSYNC Have eachreadoperation on the file descriptor wait until any pending
writes for the same portion of the file arecomplete.

Solaris 10 supports all three synchronization flags. Historically,FreeBSD (and thus
Mac OS X) have used theO_FSYNCflag, which has the same behavior asO_SYNC.
Because the two flags areequivalent, they define the flags to have the same value.
FreeBSD 8.0 doesn’t support theO_DSYNCorO_RSYNCflags. Mac OS X doesn’t
support theO_RSYNCflag, but defines theO_DSYNCflag, treating it the same as the
O_SYNCflag. Linux 3.2.0 supports theO_DSYNCflag, but treats theO_RSYNCflag
the same asO_SYNC.

The file descriptor returned byopenandopenatis guaranteed to be the lowest-
numbered unused descriptor.This fact is used by some applications to open a new file
on standardinput, standardoutput, or standarderror.For example, an application
might close standardoutput — normally,file descriptor 1—and then open another file,
knowing that it will be opened on file descriptor 1.We’ll see a better way to guarantee
that a file is open on a given descriptor in Section 3.12, when we explorethedup2
function.
Thefdparameter distinguishes theopenatfunction from theopenfunction. There
arethree possibilities:


  1. Thepathparameter specifies an absolute pathname. In this case, thefdparameter is
    ignored and theopenatfunction behaves like theopenfunction.

  2. Thepathparameter specifies a relative pathname and thefdparameter is a file
    descriptor that specifies the starting location in the file system wherethe relative
    pathname is to be evaluated. Thefdparameter is obtained by opening the directory
    wherethe relative pathname is to be evaluated.

Free download pdf