OPEN(2) | System Calls | OPEN(2) |
open
, openat
— open a file
#include
<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int
open
(const char *path,
int oflag [, mode_t mode]);
int
openat
(int fildes,
const char *path, int oflag [,
mode_t mode]);
The
open
()
function establishes the connection between a file and a file descriptor. It
creates an open file description that refers to a file and a file descriptor
that refers to that open file description. The file descriptor is used by
other I/O functions to refer to that file. The path
argument points to a pathname naming the file.
The
openat
()
function is identical to the open
() function except
that the path argument is interpreted relative to the
starting point implied by the fildes argument. If the
fildes argument has the special value
AT_FDCWD
, a relative path argument will be resolved
relative to the current working directory. If the path
argument is absolute, the fildes argument is
ignored.
The
open
()
function returns a file descriptor for the named file that is the lowest
file descriptor not currently open for that process. The open file
description is new, and therefore the file descriptor does not share it with
any other process in the system.
The file offset used to mark the current position within the file is set to the beginning of the file.
The file status flags and file access modes of the open file
description are set according to the value of oflag.
The mode argument is used only when
O_CREAT
is specified (see below).
Values for oflag are constructed by a bitwise-inclusive-OR of flags from the following list, defined in fcntl.h(3HEAD). Applications must specify exactly one of the first three values (file access modes) below in the value of oflag:
O_RDONLY
O_WRONLY
O_RDWR
Any combination of the following may be used:
O_APPEND
O_CREAT
If the file exists, this flag has no effect except as noted
under O_EXCL
below. Otherwise, the file is
created with the user ID of the file set to the effective user ID of the
process. The group ID of the file is set to the effective group IDs of
the process, or if the S_ISGID
bit is set in the
directory in which the file is being created, the file's group ID is set
to the group ID of its parent directory. If the group ID of the new file
does not match the effective group ID or one of the supplementary groups
IDs, the S_ISGID bit is cleared.
The access permission bits (see stat.h(3HEAD)) of the file mode are set to the value of mode, modified as follows (see creat(2)): a bitwise-AND is performed on the file-mode bits and the corresponding bits in the complement of the process's file mode creation mask. Thus, all bits set in the process's file mode creation mask (see umask(2)) are correspondingly cleared in the file's permission mask. The “save text image after execution bit” of the mode is cleared (see chmod(2)). When bits other than the file permission bits are set, the effect is unspecified. The mode argument does not affect whether the file is open for reading, writing or for both.
O_DIRECT
O_DIRECTORY
O_CREAT
and O_DIRECTORY
are specified then the call will fail if it would result in a file being
created. If a directory already exists at path then
it will behave as if the O_DIRECTORY
flag had not
been present. If the O_EXCL
and
O_CREAT
flags are specified, then the call will
always fail as they imply a file should always be created.O_DSYNC
O_EXCL
O_CREAT
and O_EXCL
are
set,
open
()
fails if the file exists. The check for the existence of the file and the
creation of the file if it does not exist is atomic with respect to other
threads executing open
() naming the same filename
in the same directory with O_EXCL
and
O_CREAT
set. If O_EXCL
and
O_CREAT
are set, and path
names a symbolic link, open
() fails and sets
errno to EEXIST
, regardless
of the contents of the symbolic link. If O_EXCL
is
set and O_CREAT
is not set, the result is
undefined.O_EXEC
O_LARGEFILE
O_NOCTTY
open
() does not cause the terminal device to
become the controlling terminal for the process.O_NOFOLLOW
open
() fails
and sets errno to
ELOOP
.O_NOLINKS
open
() fails and sets errno
to EMLINK
.O_CLOEXEC
FD_CLOEXEC
flag on the file descriptor. If not
performed at open time, this can later be set with the
F_SETFD
fcntl(2) command.O_CLOFORK
FD_CLOFORK
flag on the file
descriptor. If not performed at open time, this can later be set with the
F_SETFD
fcntl(2) command.O_NONBLOCK
O_NDELAY
O_NDELAY
and O_NONBLOCK
are set, O_NONBLOCK
takes precedence.
When opening a FIFO with O_RDONLY
or
O_WRONLY
set:
O_NONBLOCK
or
O_NDELAY
is set, an
open
()
for reading only returns without delay. An
open
() for writing only returns an error if no
process currently has the file open for reading.O_NONBLOCK
and
O_NDELAY
are clear, an
open
() for reading only blocks until a thread
opens the file for writing. An open
() for
writing only blocks the calling thread until a thread opens the file
for reading.After both ends of a FIFO have been opened once,
there is no guarantee that further calls to
open
()
O_RDONLY
(O_WRONLY
) will
synchronize with later calls to open
()
O_WRONLY
(O_RDONLY
)
until both ends of the FIFO have been closed by all readers and writers.
Any data written into a FIFO will be lost if both ends of the FIFO are
closed before the data is read.
When opening a block special or character special file that supports non-blocking opens:
O_NONBLOCK
or
O_NDELAY
is set, the
open
()
function returns without blocking for the device to be ready or
available. Subsequent behavior of the device is device-specific.O_NONBLOCK
and
O_NDELAY
are clear, the
open
() function blocks the calling thread
until the device is ready or available before returning.Otherwise, the behavior of O_NONBLOCK
and O_NDELAY
is unspecified.
O_RSYNC
O_DSYNC
and
O_SYNC
flags. If both
O_DSYNC
and O_RSYNC
are
set in oflag, all I/O operations on the file
descriptor complete as defined by synchronized I/O data integrity
completion. If both O_SYNC
and
O_RSYNC
are set in oflag,
all I/O operations on the file descriptor complete as defined by
synchronized I/O file integrity completion.O_SEARCH
O_SYNC
O_SYNC
.O_TRUNC
O_RDWR
or O_WRONLY
,
its length is truncated to 0 and the mode and owner are
unchanged. It has no effect on FIFO special files or terminal device
files. Its effect on other file types is implementation-dependent. The
result of using O_TRUNC
with
O_RDONLY
is undefined.O_XATTR
openat
(),
a relative path argument is interpreted as a reference to an extended
attribute of the file associated with the supplied file descriptor. This
flag therefore requires the presence of a legal
fildes argument. If set in
open
(), the implied file descriptor is that for
the current working directory. Extended attributes must be referenced with
a relative path; providing an absolute path results in a normal file
reference.If O_CREAT
is set and the file
did not previously exist, upon successful completion,
open
() marks
for update the st_atime,
st_ctime, and st_mtime fields of
the file and the st_ctime and
st_mtime fields of the parent directory.
If O_TRUNC
is set and the file
did previously exist, upon successful completion,
open
() marks
for update the st_ctime and
st_mtime fields of the file.
If both the O_SYNC
and
O_DSYNC
flags are set, the effect is as if only the
O_SYNC
flag was set.
If path refers to a STREAMS file,
oflag may be constructed from
O_NONBLOCK
or O_NODELAY
OR-ed with either O_RDONLY
,
O_WRONLY
, or O_RDWR
. Other
flag values are not applicable to STREAMS devices and have no effect on
them. The values O_NONBLOCK
and
O_NODELAY
affect the operation of STREAMS drivers
and certain functions (see read(2),
getmsg(2),
putmsg(2), and
write(2)) applied to file descriptors
associated with STREAMS files. For STREAMS drivers, the implementation of
O_NONBLOCK
and O_NODELAY
is
device-specific.
When
open
() is
invoked to open a named stream, and the
connld(4M) module has been pushed on
the pipe, open
() blocks until the server process has
issued an I_RECVFD
ioctl(2) (see
streamio(4I)) to receive the file
descriptor.
If path names the manager side
of a pseudo-terminal device, then it is unspecified whether
open
()
locks the subsidiary side so that it cannot be opened. Portable applications
must call unlockpt(3C) before
opening the subsidiary side.
If the file is a regular file and the local file system is mounted
with the nbmand
mount option, then a mandatory share
reservation is automatically obtained on the file. The share reservation is
obtained as if fcntl(2) were called
with cmd F_SHARE_NBMAND
and
the fshare_t values set as follows:
If path is a symbolic link and
O_CREAT
and O_EXCL
are set,
the link is not followed.
Certain flag values can be set following
open
() as
described in fcntl(2).
The largest value that can be represented correctly in an object of type off_t is established as the offset maximum in the open file description.
The open
() and
openat
() functions open the file and, if successful,
return a non-negative integer representing the lowest numbered unused file
descriptor; otherwise the value -1 is returned and the
global variable errno is set to indicate the error and
no files are created or modified.
Example 1 Open a file for writing by the owner.
The following example opens the file /tmp/file, either by creating it if it does not already exist, or by truncating its length to 0 if it does exist. If the call creates a new file, the access permission bits in the file mode of the file are set to permit reading and writing by the owner, and to permit reading only by group members and others.
If the call to open
() is successful, the
file is opened for writing.
#include <fcntl.h> ... int fd; mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; char *filename = "/tmp/file"; ... fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, mode); ...
Example 2 Open a file using an existence check.
The following example uses the open
()
function to try to create the LOCKFILE
file and open
it for writing. Since the open
() function specifies
the O_EXCL
flag, the call fails if the file already
exists. In that case, the application assumes that someone else is updating
the password file and exits.
#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <err.h> ... #define LOCKFILE "/etc/ptmp" ... int pfd; /* Integer for file descriptor returned by open() call. */ ... if ((pfd = open(LOCKFILE, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0) { err(1, "Cannot open %s. Try again later.", LOCKFILE); } ...
Example 3 Open a file for writing.
The following example opens a file for writing, creating the file if it does not already exist. If the file does exist, the system truncates the file to zero bytes.
#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <err.h> ... int pfd; char filename[PATH_MAX+1]; ... if ((pfd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0) { err(1, "Cannot open output file"); } ...
The open
() and
openat
() functions will fail if:
EACCES
The file exists and the permissions specified by oflag are denied.
The file does not exist and write permission is denied for the parent directory of the file to be created.
O_TRUNC
is specified and write
permission is denied.
The {PRIV_FILE_DAC_SEARCH
} privilege
allows processes to search directories regardless of permission bits.
The {PRIV_FILE_DAC_WRITE
} privilege allows
processes to open files for writing regardless of permission bits. See
privileges(7) for special
considerations when opening files owned by user ID 0
for writing. The {PRIV_FILE_DAC_READ
} privilege
allows processes to open files for reading regardless of permission
bits.
EAGAIN
EDQUOT
O_CREAT
is specified, and
either the directory where the new file entry is being placed cannot be
extended because the user's quota of disk blocks on that file system has
been exhausted, or the user's quota of inodes on the file system where the
file is being created has been exhausted.EEXIST
O_CREAT
and O_EXCL
flags are set and the named file already exists.EILSEQ
EINTR
open
().EFAULT
EINVAL
O_XATTR
flag was supplied and the
underlying file system does not support extended file attributes.EIO
open
().EISDIR
O_WRONLY
or O_RDWR
.ELOOP
A loop exists in symbolic links encountered during resolution of the path argument.
The O_NOFOLLOW
flag is set and the
final component of path is a symbolic link.
EMFILE
OPEN_MAX
} file descriptors
open in the calling process.EMLINK
O_NOLINKS
flag is set and the named file has a
link count greater than 1.EMULTIHOP
ENAMETOOLONG
PATH_MAX
} or a pathname component is longer than
{NAME_MAX
}.ENFILE
ENOENT
O_CREAT
flag is not set and the named file
does not exist; or the O_CREAT
flag is set and
either the path prefix does not exist or the path
argument points to an empty string.
The O_CREAT
and
O_DIRECTORY
flags were both set and
path did not point to a file.
ENOEXEC
O_EXEC
flag is set and
path does not point to a regular file.ENOLINK
ENOSR
ENOSPC
O_CREAT
is
specified.ENOSYS
ENOTDIR
openat
(), the
O_XATTR
flag was not supplied, and the file
descriptor does not refer to a directory. The
O_SEARCH
flag was passed and
path does not refer to a directory.
The O_DIRECTORY
flag was set and the
file was not a directory.
ENXIO
O_NONBLOCK
flag is set, the named file is a
FIFO, the O_WRONLY
flag is set, and no process has
the file open for reading; or the named file is a character special or
block special file and the device associated with this special file does
not exist or has been retired by the fault management framework.EOPNOTSUPP
AF_UNIX
socket.EOVERFLOW
O_LARGEFILE
is not set and the size of the file
cannot be represented correctly in an object of type
off_t or O_LARGEFILE
is set
and the size of the file cannot be represented correctly in an object of
type off64_t.EROFS
O_WRONLY
, O_RDWR
,
O_CREAT
(if file does not exist), or
O_TRUNC
is set in the oflag
argument.The openat
() function will fail if:
EBADF
AT_FTCWD
.The open
() function may fail if:
EAGAIN
EINVAL
ENAMETOOLONG
PATH_MAX
}.ENOMEM
ETXTBSY
O_WRONLY
or
O_RDWR
.The
open
()
function has a transitional interface for 64-bit file offsets. See
lf64(7). Note that using
open64
()
is equivalent to using
open
(with)
O_LARGEFILE
set in oflag.
chmod(2), close(2), creat(2), dup(2), exec(2), fcntl(2), getmsg(2), getrlimit(2), Intro(2), lseek(2), putmsg(2), read(2), stat(2), umask(2), write(2), attropen(3C), directio(3C), unlockpt(3C), fcntl.h(3HEAD), stat.h(3HEAD), streamio(4I), connld(4M), attributes(7), lf64(7), privileges(7), standards(7)
Hierarchical Storage Management (HSM) file systems can sometimes cause long delays when opening a file, since HSM files must be recalled from secondary storage.
February 5, 2024 | OmniOS |