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

FreeBSD Manual Pages

  
 
  

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

NAME
       fcntl --	file control

LIBRARY
       Standard	C Library (libc, -lc)

SYNOPSIS
       #include	<fcntl.h>

       int
       fcntl(int fd, int cmd, ...);

DESCRIPTION
       The fcntl() system call provides	for control over descriptors.  The ar-
       gument  fd is a descriptor to be	operated on by cmd as described	below.
       Depending on the	value of cmd, fcntl() can take an additional third ar-
       gument arg.  Unless otherwise noted below for a specific	operation, arg
       has type	int.

       F_DUPFD		 Return	a new descriptor as follows:

			     	 Lowest	numbered available descriptor  greater
				 than or equal to arg.
			     	 Same  object  references  as the original de-
				 scriptor.
			     	 New descriptor	shares the same	file offset if
				 the object was	a file.
			     	 Same access mode (read, write or read/write).
			     	 Same file status flags	(i.e., both  file  de-
				 scriptors share the same file status flags).
			     	 The  close-on-exec flag FD_CLOEXEC associated
				 with the new file descriptor is  cleared,  so
				 the  file descriptor is to remain open	across
				 execve(2) system calls.
			     	 The fork-on-exec flag	FD_CLOFORK  associated
				 with  the  new	file descriptor	is cleared, so
				 the file descriptor is	to remain open	across
				 fork(2) system	calls.
			     	 The FD_RESOLVE_BENEATH	flag, described	below,
				 will be set if	it was set on the original de-
				 scriptor.

       F_DUPFD_CLOEXEC	 Like F_DUPFD, but the FD_CLOEXEC flag associated with
			 the  new file descriptor is set, so the file descrip-
			 tor is	closed when execve(2) system call executes.

       F_DUPFD_CLOFORK	 Like F_DUPFD, but the FD_CLOFORK flag associated with
			 the new file descriptor is set, so the	file  descrip-
			 tor is	closed when fork(2) system call	executes.

       F_DUP2FD		 It is functionally equivalent to

			       dup2(fd,	arg)

       F_DUP2FD_CLOEXEC	 Like  F_DUP2FD,  but  the  FD_CLOEXEC flag associated
			 with the new file descriptor is set.

			 The F_DUP2FD and F_DUP2FD_CLOEXEC constants  are  not
			 portable,  so	they should not	be used	if portability
			 is needed.  Use dup2()	instead	of F_DUP2FD.

       F_DUP3FD		 Used to implement the dup3() call.  Do	not use	it.

       F_GETFD		 Get the flags associated with the file	descriptor fd.
			 The following flags are defined:

			 FD_CLOEXEC	     The file will be closed upon exe-
					     cution  of	 exec()	 (arg  is  ig-
					     nored).   Otherwise, the file de-
					     scriptor will remain open.

			 FD_CLOFORK	     The file will be closed upon exe-
					     cution of the  fork()  family  of
					     system calls.

			 FD_RESOLVE_BENEATH  All path name lookups relative to
					     that  file	descriptor will	behave
					     as	   if	 the	lookup	   had
					     O_RESOLVE_BENEATH		    or
					     AT_RESOLVE_BENEATH	semantics.  It
					     is	  not	permitted   to	  call
					     fchdir(2) or fchroot(2) on	such a
					     file	descriptor.	   The
					     FD_RESOLVE_BENEATH	   flag	    is
					     sticky,  meaning  that it is pre-
					     served by dup(2) and similar  op-
					     erations, and opening a directory
					     with  openat(2)  where the	direc-
					     tory descriptor has the flag  set
					     causes the	new directory descrip-
					     tor to also have the flag set.

       F_SETFD		 Set  flags  associated	 with fd.  The available flags
			 are FD_CLOEXEC,  FD_CLOFORK  and  FD_RESOLVE_BENEATH.
			 The  FD_RESOLVE_BENEATH  flag	cannot be cleared once
			 set.

       F_GETFL		 Get descriptor	status flags, as described below  (arg
			 is ignored).

       F_SETFL		 Set descriptor	status flags to	arg.

       F_GETOWN		 Get the process ID or process group currently receiv-
			 ing  SIGIO and	SIGURG signals;	process	groups are re-
			 turned	as negative values (arg	is ignored).

       F_SETOWN		 Set the process or process group to receive SIGIO and
			 SIGURG	signals; process groups	are specified by  sup-
			 plying	 arg as	negative, otherwise arg	is interpreted
			 as a process ID.

       F_READAHEAD	 Set or	clear the read ahead amount for	sequential ac-
			 cess to the third argument, arg, which	is rounded  up
			 to the	nearest	block size.  A zero value in arg turns
			 off  read ahead, a negative value restores the	system
			 default.

       F_RDAHEAD	 Equivalent to	Darwin	counterpart  which  sets  read
			 ahead amount of 128KB when the	third argument,	arg is
			 non-zero.  A zero value in arg	turns off read ahead.

       F_ADD_SEALS	 Add  seals to the file	as described below, if the un-
			 derlying filesystem supports seals.

       F_GET_SEALS	 Get seals associated with the file, if	the underlying
			 filesystem supports seals.

       F_ISUNIONSTACK	 Check if the vnode is part of a union	stack  (either
			 the  "union" flag from	mount(2) or unionfs).  This is
			 a hack	not intended to	be used	outside	of libc.

       F_KINFO		 Fills a struct	kinfo_file for the file	referenced  by
			 the  specified	 file  descriptor.   The  arg argument
			 should	point to the storage  for  struct  kinfo_file.
			 The kf_structsize member of the passed	structure must
			 be  initialized with the sizeof of struct kinfo_file,
			 to allow for the interface versioning and evolution.

       The flags for the F_GETFL and F_SETFL commands are as follows:

       O_NONBLOCK   Non-blocking I/O; if no data is  available	to  a  read(2)
		    system  call,  or if a write(2) operation would block, the
		    read or write call returns -1 with the error EAGAIN.

       O_APPEND	    Force each write to	append at the end of file; corresponds
		    to the O_APPEND flag of open(2).

       O_DIRECT	    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  minimize  the  impact the data has	on the
		    cache.  Use	of this	flag can  drastically  reduce  perfor-
		    mance if not used with care.

       O_ASYNC	    Enable  the	 SIGIO	signal to be sent to the process group
		    when I/O is	possible, e.g.,	upon availability of  data  to
		    be read.

       O_SYNC	    Enable synchronous writes.	Corresponds to the O_SYNC flag
		    of open(2).	 O_FSYNC is an historical synonym for O_SYNC.

       O_DSYNC	    Enable   synchronous  data	writes.	  Corresponds  to  the
		    O_DSYNC flag of open(2).

       The seals that may be applied with F_ADD_SEALS are as follows:

       F_SEAL_SEAL    Prevent any further seals	 from  being  applied  to  the
		      file.

       F_SEAL_SHRINK  Prevent the file from being shrunk with ftruncate(2).

       F_SEAL_GROW    Prevent the file from being enlarged with	ftruncate(2).

       F_SEAL_WRITE   Prevent  any  further  write(2)  calls to	the file.  Any
		      writes in	progress will finish before  fcntl()  returns.
		      If  any  writeable mappings exist, F_ADD_SEALS will fail
		      and return EBUSY.

       Seals are on a per-inode	basis and require support  by  the  underlying
       filesystem.   If	 the  underlying  filesystem  does  not	support	seals,
       F_ADD_SEALS and F_GET_SEALS will	fail and return	EINVAL.

       Several operations are available	for doing advisory file	locking;  they
       all operate on the following structure:

       struct flock {
	       off_t   l_start;	       /* starting offset */
	       off_t   l_len;	       /* len =	0 means	until end of file */
	       pid_t   l_pid;	       /* lock owner */
	       short   l_type;	       /* lock type: read/write, etc. */
	       short   l_whence;       /* type of l_start */
	       int     l_sysid;	       /* remote system	id or zero for local */
       };
       These  advisory	file locking operations	take a pointer to struct flock
       as the third argument arg.  The commands	available for advisory	record
       locking are as follows:

       F_GETLK	  Get  the first lock that blocks the lock description pointed
		  to by	the third argument, arg,  taken	 as  a	pointer	 to  a
		  struct  flock	 (see above).  The information retrieved over-
		  writes the information passed	to fcntl() in the flock	struc-
		  ture.	 If no lock is found that would	prevent	this lock from
		  being	created, the structure is left unchanged by this  sys-
		  tem call except for the lock type which is set to F_UNLCK.

       F_SETLK	  Set  or  clear a file	segment	lock according to the lock de-
		  scription pointed to by the third argument, arg, taken as  a
		  pointer  to  a struct	flock (see above).  F_SETLK is used to
		  establish shared (or read) locks (F_RDLCK) or	exclusive  (or
		  write)  locks,  (F_WRLCK),  as well as remove	either type of
		  lock (F_UNLCK).  If a	shared or  exclusive  lock  cannot  be
		  set, fcntl() returns immediately with	EAGAIN.

       F_SETLKW	  This	command	is the same as F_SETLK except that if a	shared
		  or exclusive lock is blocked by  other  locks,  the  process
		  waits	 until the request can be satisfied.  If a signal that
		  is to	be caught is received while fcntl() is waiting	for  a
		  region,  the	fcntl()	will be	interrupted if the signal han-
		  dler has not specified the SA_RESTART	(see sigaction(2)).

       When a shared lock has been set on a segment of a file, other processes
       can set shared locks on that segment or a portion of it.	 A shared lock
       prevents	any other process from setting an exclusive lock on  any  por-
       tion  of	 the protected area.  A	request	for a shared lock fails	if the
       file descriptor was not opened with read	access.

       An exclusive lock prevents any other process from setting a shared lock
       or an exclusive lock on any portion of the protected area.   A  request
       for  an	exclusive lock fails if	the file was not opened	with write ac-
       cess.

       The value of l_whence is	SEEK_SET, SEEK_CUR, or	SEEK_END  to  indicate
       that  the  relative  offset,  l_start  bytes, will be measured from the
       start of	the file, current position, or end of the file,	 respectively.
       The value of l_len is the number	of consecutive bytes to	be locked.  If
       l_len is	negative, l_start means	end edge of the	region.	 The l_pid and
       l_sysid	fields	are only used with F_GETLK to return the process ID of
       the process holding a blocking lock and the system  ID  of  the	system
       that  owns that process.	 Locks created by the local system will	have a
       system ID of zero.  After a successful F_GETLK request,	the  value  of
       l_whence	is SEEK_SET.

       Locks  may  start  and extend beyond the	current	end of a file, but may
       not start or extend before the beginning	of the file.  A	lock is	set to
       extend to the largest possible value of the file	offset for  that  file
       if  l_len  is set to zero.  If l_whence and l_start point to the	begin-
       ning of the file, and l_len is zero, the	entire file is locked.	If  an
       application  wishes only	to do entire file locking, the flock(2)	system
       call is much more efficient.

       There is	at most	one type of lock set for each byte in the  file.   Be-
       fore  a	successful  return from	an F_SETLK or an F_SETLKW request when
       the calling process has previously existing locks on bytes in  the  re-
       gion  specified by the request, the previous lock type for each byte in
       the specified region is replaced	by the new lock	 type.	 As  specified
       above  under  the  descriptions of shared locks and exclusive locks, an
       F_SETLK or an F_SETLKW request fails or blocks  respectively  when  an-
       other  process  has existing locks on bytes in the specified region and
       the type	of any of those	locks conflicts	with the type specified	in the
       request.

       The queuing for F_SETLKW	requests on local  files  is  fair;  that  is,
       while  the  thread is blocked, subsequent requests conflicting with its
       requests	will not be granted, even if these requests  do	 not  conflict
       with existing locks.

       This  interface follows the completely stupid semantics of System V and
       IEEE Std	1003.1-1988 ("POSIX.1")	that require that all locks associated
       with a file for a given process are removed when	 any  file  descriptor
       for  that file is closed	by that	process.  This semantic	means that ap-
       plications must be aware	of any files that a subroutine library may ac-
       cess.  For example if an	application for	 updating  the	password  file
       locks  the  password  file  database  while making the update, and then
       calls getpwnam(3) to retrieve a record, the lock	will be	 lost  because
       getpwnam(3)  opens, reads, and closes the password database.  The data-
       base close will release all locks that the process has associated  with
       the database, even if the library routine never requested a lock	on the
       database.   Another  minor semantic problem with	this interface is that
       locks are not inherited by a child process created  using  the  fork(2)
       system  call.  The flock(2) interface has much more rational last close
       semantics and allows locks to be	inherited  by  child  processes.   The
       flock(2)	 system	 call is recommended for applications that want	to en-
       sure the	integrity of their locks when using library routines  or  wish
       to pass locks to	their children.

       The  fcntl(),  flock(2),	 and lockf(3) locks are	compatible.  Processes
       using different locking interfaces can cooperate	 over  the  same  file
       safely.	However, only one of such interfaces should be used within the
       same  process.	If a file is locked by a process through flock(2), any
       record within the file will be seen as locked from the viewpoint	of an-
       other process using fcntl() or lockf(3),	and  vice  versa.   Note  that
       fcntl(F_GETLK)  returns	-1  in l_pid if	the process holding a blocking
       lock previously locked the file descriptor by flock(2).

       All locks associated with a file	for a given process are	 removed  when
       the process terminates.

       All  locks  obtained  before a call to execve(2)	remain in effect until
       the new program releases	them.  If the new program does not know	 about
       the locks, they will not	be released until the program exits.

       A  potential  for deadlock occurs if a process controlling a locked re-
       gion is put to sleep by attempting to lock the locked region of another
       process.	 This implementation detects that sleeping until a locked  re-
       gion  is	 unlocked would	cause a	deadlock and fails with	an EDEADLK er-
       ror.

RETURN VALUES
       Upon successful completion, the value returned depends on cmd  as  fol-
       lows:

	     F_DUPFD	A new file descriptor.

	     F_DUP2FD	A file descriptor equal	to arg.

	     F_GETFD	Value of flags.

	     F_GETFL	Value of flags.

	     F_GETOWN	Value of file descriptor owner.

	     other	Value other than -1.

       Otherwise,  a  value of -1 is returned and errno	is set to indicate the
       error.

ERRORS
       The fcntl() system call will fail if:

       [EAGAIN]		  The argument	cmd  is	 F_SETLK,  the	type  of  lock
			  (l_type)  is	a  shared  lock	(F_RDLCK) or exclusive
			  lock (F_WRLCK), and the segment  of  a  file	to  be
			  locked   is	already	 exclusive-locked  by  another
			  process; or the type is an exclusive lock  and  some
			  portion of the segment of a file to be locked	is al-
			  ready	 shared-locked	or exclusive-locked by another
			  process.

       [EBADF]		  The fd argument is not a valid open file descriptor.

			  The argument cmd is F_DUP2FD,	and arg	is not a valid
			  file descriptor.

			  The argument cmd is F_SETLK or F_SETLKW, the type of
			  lock (l_type)	is a shared lock (F_RDLCK), and	fd  is
			  not a	valid file descriptor open for reading.

			  The argument cmd is F_SETLK or F_SETLKW, the type of
			  lock (l_type)	is an exclusive	lock (F_WRLCK),	and fd
			  is not a valid file descriptor open for writing.

       [EBUSY]		  The  argument	 cmd is	F_ADD_SEALS, attempting	to set
			  F_SEAL_WRITE,	and writeable mappings of the file ex-
			  ist.

       [EDEADLK]	  The argument cmd is F_SETLKW,	and a deadlock	condi-
			  tion was detected.

       [EINTR]		  The  argument	 cmd  is F_SETLKW, and the system call
			  was interrupted by a signal.

       [EINVAL]		  The cmd argument is F_DUPFD and arg is  negative  or
			  greater  than	 the  maximum  allowable  number  (see
			  getdtablesize(2)).

			  The argument cmd is F_GETLK, F_SETLK or F_SETLKW and
			  the data to which arg	points is not valid.

			  The argument cmd is F_ADD_SEALS or F_GET_SEALS,  and
			  the underlying filesystem does not support sealing.

			  The argument cmd is invalid.

       [EMFILE]		  The  argument	 cmd is	F_DUPFD	and the	maximum	number
			  of file descriptors permitted	for  the  process  are
			  already  in use, or no file descriptors greater than
			  or equal to arg are available.

       [ENOTTY]		  The fd argument is not a valid file  descriptor  for
			  the requested	operation.  This may be	the case if fd
			  is  a	 device	 node,	or  a  descriptor  returned by
			  kqueue(2).

       [ENOLCK]		  The argument cmd is F_SETLK or F_SETLKW, and	satis-
			  fying	the lock or unlock request would result	in the
			  number  of  locked regions in	the system exceeding a
			  system-imposed limit.

       [EOPNOTSUPP]	  The argument cmd is F_GETLK, F_SETLK or F_SETLKW and
			  fd refers to a file for which	locking	 is  not  sup-
			  ported.

       [EOVERFLOW]	  The argument cmd is F_GETLK, F_SETLK or F_SETLKW and
			  an off_t calculation overflowed.

       [EPERM]		  The  cmd  argument is	F_SETOWN and the process ID or
			  process group	given as an argument is	in a different
			  session than the caller.

			  The cmd argument is F_ADD_SEALS and the  F_SEAL_SEAL
			  seal has already been	set.

       [ESRCH]		  The  cmd  argument  is  F_SETOWN  and	the process ID
			  given	as argument is not in use.

       In addition, if fd refers to a descriptor open on a terminal device (as
       opposed to a descriptor open on a socket), a cmd	of F_SETOWN  can  fail
       for  the	same reasons as	in tcsetpgrp(3), and a cmd of F_GETOWN for the
       reasons as stated in tcgetpgrp(3).

SEE ALSO
       close(2),  dup2(2),  execve(2),	flock(2),  getdtablesize(2),  open(2),
       sigaction(2), lockf(3), tcgetpgrp(3), tcsetpgrp(3)

STANDARDS
       The  F_DUP2FD  and  F_DUP3FD constants are not portable.	 They are pro-
       vided for compatibility with AIX	and Solaris.

       Per Version 4 of	the Single UNIX	Specification ("SUSv4"), a  call  with
       F_SETLKW	 should	 fail  with [EINTR] after any caught signal and	should
       continue	waiting	during thread suspension such as a stop	signal.	  How-
       ever,  in  this	implementation a call with F_SETLKW is restarted after
       catching	a signal with a	SA_RESTART handler or a	thread suspension such
       as a stop signal.

HISTORY
       The fcntl() system call appeared	in 4.2BSD.

       The F_DUP2FD constant first appeared in FreeBSD 7.1.

       The F_DUPFD_CLOFORK and F_DUP3FD	flags appeared in FreeBSD 15.0.

FreeBSD	15.0			 June 24, 2025			      FCNTL(2)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fcntl&sektion=2&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help