Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
OPEN(2)			      System Calls Manual		       OPEN(2)

NAME
       open, openat -- open or create a	file for reading, writing or executing

LIBRARY
       Standard	C Library (libc, -lc)

SYNOPSIS
       #include	<fcntl.h>

       int
       open(const char *path, int flags, ...);

       int
       openat(int fd, const char *path,	int flags, ...);

DESCRIPTION
       The file	name specified by path is opened for either execution or read-
       ing  and/or writing as specified	by the argument	flags and the file de-
       scriptor	returned to the	calling	process.  The flags argument may indi-
       cate the	file is	to be created if it does not exist (by specifying  the
       O_CREAT	flag).	In this	case open() and	openat() require an additional
       argument	mode_t mode, and the file is created with  mode	 mode  as  de-
       scribed	in  chmod(2)  and  modified  by	 the process' umask value (see
       umask(2)).

       The openat() function is	equivalent to the open()  function  except  in
       the  case  where	 the path specifies a relative path.  For openat() and
       relative	path, the file to be opened is determined relative to the  di-
       rectory	associated  with the file descriptor fd	instead	of the current
       working directory.  The flag parameter and the optional fourth  parame-
       ter  correspond	exactly	 to  the parameters of open().	If openat() is
       passed the special value	AT_FDCWD in  the  fd  parameter,  the  current
       working	directory  is  used and	the behavior is	identical to a call to
       open().

       When openat() is	called with an absolute	path, it ignores the fd	 argu-
       ment.

       In  capsicum(4) capability mode,	open() is not permitted.  The path ar-
       gument to openat() must be strictly relative to a file  descriptor  fd;
       that  is,  path	must not be an absolute	path and must not contain ".."
       components which	cause the path resolution to escape the	directory  hi-
       erarchy	starting  at  fd.   Additionally, no symbolic link in path may
       target absolute path or contain escaping	".." components.  fd must  not
       be AT_FDCWD.

       If  the vfs.lookup_cap_dotdot sysctl(3) MIB is set to zero, ".."	compo-
       nents in	the paths, used	in capability mode, are	 completely  disabled.
       If  the	vfs.lookup_cap_dotdot_nonlocal MIB is set to zero, ".."	is not
       allowed if found	on non-local filesystem.

       The flags are formed by or'ing the following values:

       O_RDONLY		  open for reading only

       O_WRONLY		  open for writing only

       O_RDWR		  open for reading and writing

       O_EXEC		  open for execute only

       O_SEARCH		  open for search only (an alias for O_EXEC  typically
			  used with O_DIRECTORY)

       O_NONBLOCK	  do not block on open

       O_APPEND		  set  file pointer to the end of the file before each
			  write

       O_CREAT		  create file if it does not exist

       O_TRUNC		  truncate size	to 0

       O_EXCL		  fail if O_CREAT is set and the file exists

       O_SHLOCK		  atomically obtain a shared lock

       O_EXLOCK		  atomically obtain an exclusive lock

       O_DIRECT		  read and write directly from the backing store

       O_FSYNC		  synchronous data  and	 metadata  writes  (historical
			  synonym for O_SYNC)

       O_SYNC		  synchronous data and metadata	writes

       O_DSYNC		  synchronous data writes

       O_NOFOLLOW	  do not follow	symlinks

       O_NOCTTY		  ignored

       O_TTY_INIT	  ignored

       O_DIRECTORY	  error	if file	is not a directory

       O_CLOEXEC	  automatically	close file on execve(2)

       O_CLOFORK	  automatically	 close	file on	any child process cre-
			  ated with fork(2)

       O_VERIFY		  verify the contents of the file with mac_veriexec(4)

       O_RESOLVE_BENEATH  (openat(2) only) path	resolution must	not cross  the
			  fd directory

       O_PATH		  record only the target path in the opened descriptor

       O_EMPTY_PATH	  (openat(2)  only) open file referenced by fd if path
			  is empty

       O_NAMEDATTR	  open a named attribute or named attribute directory

       Exactly one of the flags	O_RDONLY, O_WRONLY, O_RDWR, or O_EXEC must  be
       provided.

       Opening	a  file	 with  O_APPEND	set causes each	write on the resulting
       file descriptor to be appended to the end of the	file.

       If O_TRUNC is specified and the file exists, the	file is	 truncated  to
       zero length.

       If O_CREAT is set, but file already exists, this	flag has no effect ex-
       cept  when  O_EXCL  is  set too,	in this	case open() fails with EEXIST.
       This may	be used	to implement a simple exclusive	access locking	mecha-
       nism.   In  all other cases, the	file is	created	and the	access permis-
       sion bits (see chmod(2))	of the file mode are set to the	value  of  the
       third  argument	taken  as mode_t mode and passed through the umask(2).
       This argument does not affect whether the file is opened	 for  reading,
       writing,	 or  for both.	The open' request for a	lock on	the file, cre-
       ated with O_CREAT, will never fail provided that	 the  underlying  file
       system supports locking;	see also O_SHLOCK and O_EXLOCK below.

       If  O_EXCL  is set and the last component of the	pathname is a symbolic
       link, open() will fail even if the symbolic link	points to a  non-exis-
       tent name.

       If  O_NONBLOCK  is specified and	the open() system call would block for
       some reason (for	example, waiting for carrier on	a dialup line),	open()
       returns immediately.  The descriptor remains in non-blocking  mode  for
       subsequent operations.

       If O_SYNC is used in the	mask, all writes will immediately and synchro-
       nously  be  written  to	disk.	O_FSYNC	 is  an	historical synonym for
       O_SYNC.

       If O_DSYNC is used in the mask, all data	and metadata required to  read
       the data	will be	synchronously written to disk, but changes to metadata
       such as file access and modification timestamps may be written later.

       If  O_NOFOLLOW is used in the mask and the target file passed to	open()
       is a symbolic link then the open() will fail.

       When opening a file, a lock with	flock(2) semantics can be obtained  by
       setting O_SHLOCK	for a shared lock, or O_EXLOCK for an exclusive	lock.

       O_DIRECT	 may  be  used	to  minimize or	eliminate the cache effects of
       reading and writing.  The system	will attempt to	avoid caching the data
       you read	or write.  If it cannot	avoid caching the data,	it will	 mini-
       mize  the impact	the data has on	the cache.  Use	of this	flag can dras-
       tically reduce performance if not used with  care.   The	 semantics  of
       this  flag are filesystem dependent, and	some filesystems may ignore it
       entirely.

       O_NOCTTY	may be used to ensure the OS does not assign this file as  the
       controlling  terminal  when it opens a tty device.  This	is the default
       on FreeBSD, but is present for POSIX compatibility.  The	open()	system
       call will not assign controlling	terminals on FreeBSD.

       O_TTY_INIT  may	be used	to ensure the OS restores the terminal attrib-
       utes when initially opening a TTY.  This	is the default on FreeBSD, but
       is present for POSIX compatibility.  The	initial	call to	 open()	 on  a
       TTY will	always restore default terminal	attributes on FreeBSD.

       O_DIRECTORY  may	be used	to ensure the resulting	file descriptor	refers
       to a directory.	This flag can be used to prevent applications with el-
       evated privileges from opening files which are even unsafe to open with
       O_RDONLY, such as device	nodes.

       O_CLOEXEC may be	used to	set FD_CLOEXEC flag  for  the  newly  returned
       file descriptor.

       O_CLOFORK  may  be  used	 to set	FD_CLOFORK flag	for the	newly returned
       file descriptor.	 The file will be closed on any	child process  created
       with  fork(2), vfork(2) or rfork(2) with	the RFFDG flag,	remaining open
       in the parent.  Both the	O_CLOEXEC and O_CLOFORK	flags can be  modified
       with the	F_SETFD	fcntl(2) command.

       O_VERIFY	may be used to indicate	to the kernel that the contents	of the
       file  should  be	verified before	allowing the open to proceed.  The de-
       tails of	what "verified"	means is implementation	 specific.   The  run-
       time  linker  (rtld)  uses this flag to ensure shared objects have been
       verified	before operating on them.

       O_RESOLVE_BENEATH returns ENOTCAPABLE if	any intermediate component  of
       the  specified relative path does not reside in the directory hierarchy
       beneath the starting directory.	Absolute paths or  even	 the  temporal
       escape from beneath of the starting directory is	not allowed.

       When  a	directory  is  opened  with  O_SEARCH, execute permissions are
       checked at open time.  The returned file	descriptor may not be used for
       any read	operations like	getdirentries(2).  The primary use of this de-
       scriptor	is as the lookup descriptor for	the *at() family of functions.
       If O_SEARCH was not requested at	open time, then	 the  *at()  functions
       use  the	 current directory permissions for the directory referenced by
       the descriptor at the time of the *at() call.

       O_PATH returns a	file descriptor	that can be used as a  directory  file
       descriptor for openat() and other system	calls taking a file descriptor
       argument,  like	fstatat(2) and others.	The other functionality	of the
       returned	file descriptor	is limited to the  following  descriptor-level
       operations:

	     fcntl(2)		but advisory locking is	not allowed
	     dup(2)
	     close(2)
	     fstat(2)
	     fstatfs(2)
	     fchdir(2)
	     fchroot(2)
	     fexecve(2)
	     funlinkat(2)	can be passed as the third argument
	     SCM_RIGHTS		can  be	 passed	 over a	unix(4)	socket using a
				SCM_RIGHTS message
	     kqueue(2)		only with EVFILT_VNODE
	     __acl_get_fd(2)
	     __acl_aclcheck_fd(2)
	     extattr(2)
	     capsicum(4)	can be passed to cap_*_limit() and cap_*_get()
				system calls (such as cap_rights_limit(2)).

       Other operations	like read(2), ftruncate(2), and	any other that operate
       on file and not on file descriptor (except fstat(2)), are not allowed.

       A file descriptor created with the O_PATH flag can be opened as a  nor-
       mal  (operable)	file descriptor	by specifying it as the	fd argument to
       openat()	with an	empty path and the O_EMPTY_PATH	flag.	Such  an  open
       behaves	as if the current path of the file referenced by fd is passed,
       except that path	walk permissions are not checked.  See	also  the  de-
       scription of AT_EMPTY_PATH flag for fstatat(2) and related syscalls.

       Conversely,  a  file descriptor fd referencing a	filesystem file	can be
       converted to the	O_PATH type of descriptor by using the following call
	     opath_fd =	openat(fd, "", O_EMPTY_PATH | O_PATH);

       If successful, open() returns a non-negative integer, termed a file de-
       scriptor.  It returns -1	on failure.  The  file	descriptor  value  re-
       turned  is  the	lowest numbered	descriptor currently not in use	by the
       process.	 The file pointer used to mark the current position within the
       file is set to the beginning of the file.

       If a sleeping open of a device node from	devfs(4) is interrupted	 by  a
       signal,	the  call always fails with EINTR, even	if the SA_RESTART flag
       is set for the signal.  A sleeping open of a fifo  (see	mkfifo(2))  is
       restarted as normal.

       When  a	new file is created, it	is assigned the	group of the directory
       which contains it.

       Unless O_CLOEXEC	flag was specified, the	new descriptor is set  to  re-
       main open across	execve(2) system calls;	see close(2), fcntl(2) and the
       description of the O_CLOEXEC flag.

       When the	O_NAMEDATTR flag is specified for an openat() where the	fd ar-
       gument  is  for a file object, a	named attribute	for the	file object is
       opened and not the file object itself.  If the O_CREAT  flag  has  been
       specified  as  well, the	named attribute	will be	created	if it does not
       exist.  When the	O_NAMEDATTR flag is specified for a  open(),  a	 named
       attribute  for the current working directory is opened and not the cur-
       rent working directory.	The path argument for this openat() or	open()
       must  be	a single component name	with no	embedded `/'.  If the path ar-
       gument is `.' then the named attribute directory	for the	file object is
       opened.	(See named_attribute(7)	for more information.)

       The system imposes a limit on the number	of file	descriptors  open  si-
       multaneously  by	one process.  The getdtablesize(2) system call returns
       the current system limit.

RETURN VALUES
       If successful, open()  and  openat()  return  a	non-negative  integer,
       termed  a file descriptor.  They	return -1 on failure, and set errno to
       indicate	the error.

ERRORS
       The named file is opened	unless:

       [ENOTDIR]	  A component of the path prefix is not	a directory.

       [ENAMETOOLONG]	  A component of a pathname exceeded  255  characters,
			  or an	entire path name exceeded 1023 characters.

       [ENOENT]		  O_CREAT  is  not set and the named file does not ex-
			  ist.

       [ENOENT]		  A component of the path name that  must  exist  does
			  not exist.

       [EACCES]		  Search  permission  is denied	for a component	of the
			  path prefix.

       [EACCES]		  The required permissions (for	reading	 and/or	 writ-
			  ing) are denied for the given	flags.

       [EACCES]		  O_TRUNC is specified and write permission is denied.

       [EACCES]		  O_CREAT  is  specified, the file does	not exist, and
			  the directory	in which it is to be created does  not
			  permit writing.

       [EPERM]		  O_CREAT  is  specified, the file does	not exist, and
			  the directory	in which it is to be created  has  its
			  immutable  flag  set,	see the	chflags(2) manual page
			  for more information.

       [EPERM]		  The named file has its immutable flag	 set  and  the
			  file is to be	modified.

       [EPERM]		  The  named  file  has	 its append-only flag set, the
			  file is to be	modified, and O_TRUNC is specified  or
			  O_APPEND is not specified.

       [ELOOP]		  Too  many  symbolic links were encountered in	trans-
			  lating the pathname.

       [EISDIR]		  The named file is a  directory,  and	the  arguments
			  specify it is	to be modified.

       [EISDIR]		  The  named file is a directory, and the flags	speci-
			  fied O_CREAT without O_DIRECTORY.

       [EROFS]		  The named file resides on a read-only	 file  system,
			  and the file is to be	modified.

       [EROFS]		  O_CREAT is specified and the named file would	reside
			  on a read-only file system.

       [EMFILE]		  The  process	has already reached its	limit for open
			  file descriptors.

       [ENFILE]		  The system file table	is full.

       [EMLINK]		  O_NOFOLLOW was specified and the target  is  a  sym-
			  bolic	 link.	 POSIX specifies a different error for
			  this case; see the note in "STANDARDS" below.

       [ENXIO]		  The named file is a character	special	or block  spe-
			  cial	file, and the device associated	with this spe-
			  cial file does not exist.

       [ENXIO]		  O_NONBLOCK  is  set,	the  named  file  is  a	 fifo,
			  O_WRONLY  is	set,  and no process has the file open
			  for reading.

       [EINTR]		  The open() operation was interrupted by a signal.

       [EOPNOTSUPP]	  O_SHLOCK or O_EXLOCK is specified but	the underlying
			  file system does not support locking.

       [EOPNOTSUPP]	  The named file is a special file mounted  through  a
			  file	system that does not support access to it (for
			  example, NFS).

       [EWOULDBLOCK]	  O_NONBLOCK and one of	O_SHLOCK or O_EXLOCK is	speci-
			  fied and the file is locked.

       [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	direc-
			  tory.

       [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.

       [EDQUOT]		  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 the	user's
			  quota	of disk	blocks on the file  system  containing
			  the directory	has been exhausted.

       [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.

       [EIO]		  An I/O error occurred	while making the directory en-
			  try or allocating the	inode for O_CREAT.

       [EINTEGRITY]	  Corrupted  data  was detected	while reading from the
			  file system.

       [ETXTBSY]	  The file is a	pure procedure (shared text) file that
			  is being executed and	the  open()  system  call  re-
			  quests write access.

       [EFAULT]		  The path argument points outside the process's allo-
			  cated	address	space.

       [EEXIST]		  O_CREAT  and	O_EXCL were specified and the file ex-
			  ists.

       [EOPNOTSUPP]	  An attempt was made to open a	socket (not  currently
			  implemented).

       [EINVAL]		  An attempt was made to open a	descriptor with	an il-
			  legal	 combination of	O_RDONLY, O_WRONLY, or O_RDWR,
			  and O_EXEC or	O_SEARCH.

       [EINVAL]		  O_CREAT is specified,	and the	last component of  the
			  path argument	is invalid on the file system on which
			  the file is being created.

       [EBADF]		  The  path argument does not specify an absolute path
			  and the fd argument is neither AT_FDCWD nor a	 valid
			  file descriptor open for searching.

       [ENOTDIR]	  The  path argument is	not an absolute	path and fd is
			  neither AT_FDCWD nor a  file	descriptor  associated
			  with a directory.

       [ENOTDIR]	  O_DIRECTORY  is  specified and the file is not a di-
			  rectory.

       [ECAPMODE]	  AT_FDCWD is specified	and the	process	is in capabil-
			  ity mode.

       [ECAPMODE]	  open() was called and	the process is	in  capability
			  mode.

       [ENOTCAPABLE]	  path is an absolute path and the process is in capa-
			  bility mode.

       [ENOTCAPABLE]	  path	is  an	absolute path and O_RESOLVE_BENEATH is
			  specified.

       [ENOTCAPABLE]	  path contains	a ".." component leading to  a	direc-
			  tory outside of the directory	hierarchy specified by
			  fd and the process is	in capability mode.

       [ENOTCAPABLE]	  path	contains  a ".." component leading to a	direc-
			  tory outside of the directory	hierarchy specified by
			  fd and O_RESOLVE_BENEATH is specified.

       [ENOTCAPABLE]	  path	  contains    a	   ".."	    component,	   the
			  vfs.lookup_cap_dotdot	 sysctl(3)  is	set,  and  the
			  process is in	capability mode.

       [ENOATTR]	  O_NAMEDATTR has been specified and the  file	object
			  is  not  a  named  attribute	directory or named at-
			  tribute.

SEE ALSO
       chmod(2), close(2), dup(2),  fexecve(2),	 fhopen(2),  getdtablesize(2),
       getfh(2),  lgetfh(2),  lseek(2),	read(2), umask(2), write(2), fopen(3),
       capsicum(4), named_attribute(7)

STANDARDS
       These functions are specified by	IEEE Std 1003.1-2008 ("POSIX.1").

       FreeBSD sets errno to EMLINK instead of ELOOP  as  specified  by	 POSIX
       when  O_NOFOLLOW	is set in flags	and the	final component	of pathname is
       a symbolic link to distinguish it from the case of  too	many  symbolic
       link traversals in one of its non-final components.

       The  Open  Group	 Extended API Set 2 specification, that	introduced the
       *at() API, required that	the test for whether fd	is searchable is based
       on whether fd is	open for searching, not	whether	the underlying	direc-
       tory  currently	permits	 searches.   The present implementation	of the
       openat  system  call  is	 believed  to  be  compatible  with  IEEE  Std
       1003.1-2008,  2017  Edition  ("POSIX.1"), which specifies that behavior
       for O_SEARCH, in	the absence of the flag	the implementation checks  the
       current permissions of a	directory.

HISTORY
       The  open()  function  appeared	in  Version 1 AT&T UNIX.  The openat()
       function	was introduced in FreeBSD  8.0.	  O_DSYNC  appeared  in	 13.0.
       O_NAMEDATTR appeared in 15.0.  O_CLOFORK	appeared in FreeBSD 15.0.

BUGS
       The  mode argument is variadic and may result in	different calling con-
       ventions	than might otherwise be	expected.

FreeBSD	16.0 CURRENT		 May 17, 2025			       OPEN(2)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=open&manpath=FreeBSD+16.0-CURRENT>

home | help