- Make open(2) more POSIX compliant - Add a test case for dangling symlinks and open() syscall with O_CREAT and O_EXCL on a symlink. - Update open(2) man page to reflect change.
189 lines
4.9 KiB
Groff
189 lines
4.9 KiB
Groff
.\" Copyright (c) 1980 Regents of the University of California.
|
|
.\" All rights reserved. The Berkeley software License Agreement
|
|
.\" specifies the terms and conditions for redistribution.
|
|
.\"
|
|
.\" @(#)open.2 6.4 (Berkeley) 5/14/86
|
|
.\"
|
|
.TH OPEN 2 "May 14, 1986"
|
|
.UC 4
|
|
.SH NAME
|
|
open \- open a file for reading or writing, or create a new file
|
|
.SH SYNOPSIS
|
|
.nf
|
|
.ft B
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
|
|
int open(const char *\fIpath\fP, int \fIflags\fP \fR[\fP, mode_t \fImode\fP\fR]\fP)
|
|
.ft R
|
|
.fi
|
|
.SH DESCRIPTION
|
|
.B Open
|
|
opens the file
|
|
.I path
|
|
for reading and/or writing, as specified by the
|
|
.I flags
|
|
argument and returns a descriptor for that file.
|
|
The
|
|
.I flags
|
|
argument may indicate the file is to be
|
|
created if it does not already exist (by specifying the
|
|
O_CREAT flag), in which case the file is created with mode
|
|
.I mode
|
|
as described in
|
|
.BR chmod (2)
|
|
and modified by the process' umask value (see
|
|
.BR umask (2)).
|
|
.PP
|
|
.I Path
|
|
is the address of a string of ASCII characters representing
|
|
a path name, terminated by a null character.
|
|
The flags specified are formed by
|
|
.IR or 'ing
|
|
the following values
|
|
.PP
|
|
.RS
|
|
.ta +12n
|
|
.nf
|
|
O_RDONLY open for reading only
|
|
O_WRONLY open for writing only
|
|
O_RDWR open for reading and writing
|
|
O_NONBLOCK do not block on open
|
|
O_APPEND append on each write
|
|
O_CREAT create file if it does not exist
|
|
O_TRUNC truncate size to 0
|
|
O_EXCL error if create and file exists
|
|
.fi
|
|
.DT
|
|
.RE
|
|
.PP
|
|
Opening a file with O_APPEND set causes each write on the file
|
|
to be appended to the end. If O_TRUNC is specified and the
|
|
file exists, the file is truncated to zero length.
|
|
If O_EXCL is set with O_CREAT, then if the file already
|
|
exists, the open returns an error. This can be used to
|
|
implement a simple exclusive access locking mechanism.
|
|
If O_EXCL is set and the last component of the pathname is
|
|
a symbolic link, the open will fail even if the symbolic
|
|
link points to a non-existent name.
|
|
If the O_NONBLOCK flag is specified and the open call would result
|
|
in the process being blocked for some reason, the open returns immediately.
|
|
.PP
|
|
Upon successful completion a non-negative integer termed a
|
|
file descriptor is returned.
|
|
The file pointer used to mark the current position within the
|
|
file is set to the beginning of the file.
|
|
.PP
|
|
The new descriptor is set to remain open across
|
|
.BR execve
|
|
system calls; see
|
|
.BR close (2).
|
|
.PP
|
|
The system imposes a limit on the number of descriptors
|
|
open simultaneously by one process.
|
|
.SH "ERRORS
|
|
The named file is opened unless one or more of the
|
|
following are true:
|
|
.TP 15
|
|
[ENOTDIR]
|
|
A component of the path prefix is not a directory.
|
|
.TP 15
|
|
[ENAMETOOLONG]
|
|
The path name exceeds PATH_MAX characters.
|
|
.TP 15
|
|
[ENOENT]
|
|
O_CREAT is not set and the named file does not exist.
|
|
.TP 15
|
|
[ENOENT]
|
|
A component of the path name that must exist does not exist.
|
|
.TP 15
|
|
[EACCES]
|
|
Search permission is denied for a component of the path prefix.
|
|
.TP 15
|
|
[EACCES]
|
|
The required permissions (for reading and/or writing)
|
|
are denied for the named file.
|
|
.TP 15
|
|
[EACCES]
|
|
O_CREAT is specified,
|
|
the file does not exist,
|
|
and the directory in which it is to be created
|
|
does not permit writing.
|
|
.TP 15
|
|
[EACCES]
|
|
A device to be opened for writing is physically write protected.
|
|
.TP 15
|
|
[ELOOP]
|
|
Too many symbolic links were encountered in translating the pathname.
|
|
(Minix-vmd)
|
|
.TP 15
|
|
[EISDIR]
|
|
The named file is a directory, and the arguments specify
|
|
it is to be opened for writing.
|
|
.TP 15
|
|
[EROFS]
|
|
The named file resides on a read-only file system,
|
|
and the file is to be modified.
|
|
.TP 15
|
|
[EMFILE]
|
|
The system limit for open file descriptors per process has already been reached.
|
|
.TP 15
|
|
[ENFILE]
|
|
The system file table is full.
|
|
.TP 15
|
|
[ENXIO]
|
|
The named file is a character special or block
|
|
special file, and the device associated with this special file
|
|
does not exist.
|
|
.TP 15
|
|
[ENOSPC]
|
|
O_CREAT is specified,
|
|
the file does not exist,
|
|
and the directory in which the entry for the new file is being placed
|
|
cannot be extended because there is no space left on the file
|
|
system containing the directory.
|
|
.TP 15
|
|
[ENOSPC]
|
|
O_CREAT is specified,
|
|
the file does not exist,
|
|
and there are no free inodes on the file system on which the
|
|
file is being created.
|
|
.ig
|
|
.TP 15
|
|
[EDQUOT]
|
|
O_CREAT is specified,
|
|
the file does not exist,
|
|
and the directory in which the entry for the new fie
|
|
is being placed cannot be extended because the
|
|
user's quota of disk blocks on the file system
|
|
containing the directory has been exhausted.
|
|
.TP 15
|
|
[EDQUOT]
|
|
O_CREAT is specified,
|
|
the file does not exist,
|
|
and the user's quota of inodes on the file system on
|
|
which the file is being created has been exhausted.
|
|
..
|
|
.TP 15
|
|
[EIO]
|
|
An I/O error occurred while making the directory entry or
|
|
allocating the inode for O_CREAT.
|
|
.TP 15
|
|
[EFAULT]
|
|
.I Path
|
|
points outside the process's allocated address space.
|
|
.TP 15
|
|
[EEXIST]
|
|
O_CREAT and O_EXCL were specified and the file exists or
|
|
.I
|
|
path
|
|
names a symbolic link (regardless of contents of the link).
|
|
.SH "SEE ALSO"
|
|
.BR chmod (2),
|
|
.BR close (2),
|
|
.BR dup (2),
|
|
.BR fcntl (2),
|
|
.BR lseek (2),
|
|
.BR read (2),
|
|
.BR write (2),
|
|
.BR umask (2).
|