3.3 open Function
A file is opened or created by calling the open function.
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname,
int oflag, ... /* , mode_t
mode */ ); Returns: file descriptor if OK,
-1 on error
We show the third argument as ..., which is the ANSI C way to specify that the number and types of the remaining arguments may vary. For this function the third argument is only used when a new file is being created, as we describe later. We show this argument as a comment in the prototype.
The pathname is the name of the file to open or create. There are a multitude of options for this function, which are specified by the oflag argument. This argument is formed by OR'ing together one or more of the following constants (from the <fcntl.h> header).
O_RDONLY | Open for reading only. |
O_WRONLY | Open for writing only. |
O_RDWR | Open for reading and writing. |
Most implementations define O_RDONLY as 0, O_WRONLY as 1, and O_RDWR as 2, for compatibility with older programs. |
One and only one of these three constants must be specified. The following constants are optional:
O_APPEND | Append to the end of file on each write. We describe this option in detail in Section 3.11. |
O_CREAT | Create the file if it doesn't exist. This option requires a third argument to the open function, the mode, which specifies the access permission bits of the new file. (When we describe a file's access permission bits in Section 4.5, we'll see how to specify the mode, and how it can be modified by the umask value of a process.) |
O_EXCL | Generate an error if O_CREAT is also specified and the file already exists. This test for whether the file already exists and the creation of the file if it doesn't exist is an atomic operation. We describe atomic operations in more detail in Section 3.11. |
O_TRUNC | If the file exists, and if the file is successfully opened for either write-only or read-write, truncate its length to 0. |
O_NOCTTY | If the pathname refers to a terminal device, do not allocate the device as the controlling terminal for this process. We talk about controlling terminals in Section 9.6. |
O_NONBLOCK | If the pathname refers to a FIFO, a block special file, or a character special file, this option sets the nonblocking mode for both the opening of the file and for subsequent I/O. We describe this mode in Section 12.2. In earlier releases of System V the O_NDELAY (no delay)
flag was introduced. This option is similar to the O_NONBLOCK
(nonblocking) option, but an ambiguity was introduced in the return
value from a read operation. The no-delay option causes a read to
return 0 if there is no data to be read from a pipe, FIFO, or device,
but this conflicts with a return value of 0 indicating an end of file.
SVR4 still supports the no-delay option, with the old semantics, but
new applications should use the non-blocking option instead. |
O_SYNC | Have each write wait for physical I/O to complete. We use this option in Section 3.13. The O_SYNC option is not part of POSIX.1. It is supported
by SVR4. |
The file descriptor returned by open is guaranteed to be the lowest numbered unused descriptor. This is used by some applications to open a new file on standard input, standard output, or standard error. For example, an application might close standard output (normally file descriptor 1) and then open some other 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 with the dup2 function.
Filename and Pathname Truncation
What happens if NAME_MAX is 14 and we try to create a new file in the current directory with a filename containing 15 characters? Traditionally, earlier releases of System V allowed this to happen, silently truncating the filename beyond the 14th character, while Berkeley-derived systems return the error ENAMETOOLONG. This problem does not apply just to the creation of new files. If NAME_MAX is 14 and a file exists whose name is exactly 14 characters, then any function that accepts a pathname argument (open, stat, etc.) has to deal with this problem.
With POSIX.1 the constant _POSIX_NO_TRUNC determines whether long filenames and long pathnames are truncated or whether an error is returned. As we saw in Chapter 2, this value can vary on a per-filesystem basis.
FIPS 151–1 requires that an error be returned.
SVR4 does not generate an error for a traditional System V filesystem (S5). (See Figure 2.6.) For a Berkeley-style filesystem (UFS), however, SVR4 does generate an error.
4.3+BSD always returns an error.
If _POSIX_NO_TRUNC is in effect, then the error ENAMETOOLONG is returned if either the entire pathname exceeds PATH_MAX, or if any filename component of the pathname exceeds NAME_MAX.