fcntl(2)




NAME

     fcntl - file control


SYNOPSIS

     #include <sys/types.h>
     #include <unistd.h>
     #include <fcntl.h>

     int fcntl(int fildes, int cmd, /* arg */ ...);


DESCRIPTION

     The fcntl() function provides for control over  open  files.
     The fildes argument is an open file descriptor.

     The fcntl() function may take a third argument,  arg,  whose
     data  type, value and use depend upon the value of cmd.  The
     cmd argument specifies the  operation  to  be  performed  by
     fcntl().

     The available values for  cmd  are  defined  in  the  header
     <fcntl.h>, which include:

     F_DUPFD
           Return a new file descriptor which is the lowest  num-
           bered  available  (that  is,  not  already  open) file
           descriptor greater than or equal to  the  third  argu-
           ment,  arg,  taken  as an integer of type int. The new
           file descriptor refers to the same open file  descrip-
           tion  as  the original file descriptor, and shares any
           locks. The FD_CLOEXEC flag  associated  with  the  new
           file  descriptor  is  cleared  to  keep  the file open
           across calls to one of the exec(2) functions.

     F_DUP2FD
           Similar to  F_DUPFD, but always returns arg.  F_DUP2FD
           closes  arg  if  it  is  open and not equal to fildes.
           F_DUP2FD is equivalent to  dup2(fildes, arg).

     F_FREESP
           Free storage space associated with a  section  of  the
           ordinary  file  fildes.  The section is specified by a
           variable of data type struct flock pointed to by  arg.
           The data type struct flock is defined in the <fcntl.h>
           header (see fcntl(3HEAD)) and is described below. Note
           that  all  file systems might not support all possible
           variations of F_FREESP arguments.  In particular, many
           file  systems  allow space to be freed only at the end
           of a file.

     F_GETFD
           Get the file descriptor  flags  defined  in  <fcntl.h>
           that  are  associated with the file descriptor fildes.
           File descriptor flags are  associated  with  a  single
           file  descriptor and do not affect other file descrip-
           tors that refer to the same file.

     F_GETFL
           Get the file  status  flags  and  file  access  modes,
           defined  in  <fcntl.h>, for the file descriptor speci-
           fied  by  fildes.   The  file  access  modes  can   be
           extracted   from  the  return  value  using  the  mask
           O_ACCMODE, which is defined in <fcntl.h>.  File status
           flags  and  file access modes do not affect other file
           descriptors that refer to the same file with different
           open file descriptions.

     F_GETOWN
           If fildes refers to a socket, get the process or  pro-
           cess group ID specified to receive SIGURG signals when
           out-of-band data is available.  Positive values  indi-
           cate  a  process  ID;  negative values, other than -1,
           indicate a process group ID. If fildes does not  refer
           to a socket, the results are unspecified.

     F_GETXFL
           Get the file status flags, file access modes, and file
           creation  and  assignment flags, defined in <fcntl.h>,
           for the file descriptor specified by fildes.  The file
           access  modes  can  be extracted from the return value
           using  the  mask  O_ACCMODE,  which  is   defined   in
           <fcntl.h>.   File status flags, file access modes, and
           file creation and assignment flags do not affect other
           file descriptors that refer to the same file with dif-
           ferent open file descriptions.

     F_SETFD
           Set the file descriptor flags  defined  in  <fcntl.h>,
           that  are  associated  with fildes, to the third argu-
           ment, arg, taken as type int. If the  FD_CLOEXEC  flag
           in  the third argument is 0, the file will remain open
           across the exec() functions; otherwise the  file  will
           be  closed  upon  successful  execution  of one of the
           exec() functions.

     F_SETFL
           Set the file status flags, defined in  <fcntl.h>,  for
           the  file  descriptor  specified  by  fildes  from the
           corresponding bits in the arg argument, taken as  type
           int.  Bits  corresponding  to the file access mode and
           file creation and assignment flags that are set in arg
           are  ignored. If any bits in arg other than those men-
           tioned here are changed by the application, the result
           is unspecified.

     F_SETOWN
           If fildes refers to a socket, set the process or  pro-
           cess group ID specified to receive SIGURG signals when
           out-of-band data is available, using the value of  the
           third  argument,  arg,  taken  as  type int.  Positive
           values indicate a process ID; negative  values,  other
           than  -1,  indicate a process group ID. If fildes does
           not refer to a socket, the results are unspecified.

     The following commands are  available  for  advisory  record
     locking.  Record locking is supported for regular files, and
     may be supported for other files.

     F_GETLK
           Get the first lock which blocks the  lock  description
           pointed  to  by  the  third  argument, arg, taken as a
           pointer to type struct flock,  defined  in  <fcntl.h>.
           The  information  retrieved overwrites the information
           passed to fcntl() in the structure flock. If  no  lock
           is  found  that  would  prevent  this  lock from being
           created, then the structure  will  be  left  unchanged
           except for the lock type which will be set to F_UNLCK.

     F_GETLK64
           Equivalent to F_GETLK,  but  takes  a  struct  flock64
           argument rather than a struct flock argument.

     F_SETLK
           Set or clear a file segment lock according to the lock
           description  pointed  to  by  the third argument, arg,
           taken as a pointer to type struct  flock,  defined  in
           <fcntl.h>.  F_SETLK  is  used  to establish shared (or
           read) locks (F_RDLCK) or exclusive  (or  write)  locks
           (F_WRLCK),  as  well  as to remove either type of lock
           (F_UNLCK). F_RDLCK, F_WRLCK and F_UNLCK are defined in
           <fcntl.h>.  If  a  shared  or exclusive lock cannot be
           set, fcntl() will return  immediately  with  a  return
           value of -1.

     F_SETLK64
           Equivalent to F_SETLK,  but  takes  a  struct  flock64
           argument rather than a struct flock argument.

     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 will wait until the request can be  satis-
           fied.  If  a  signal  that is to be caught is received
           while fcntl() is waiting for a region, fcntl() will be
           interrupted.   Upon  return  from  the process' signal
           handler, fcntl() will return  -1  with  errno  set  to
           EINTR, and the lock operation will not be done.

     F_SETLKW64
           Equivalent to F_SETLKW, but  takes  a  struct  flock64
           argument rather than a struct flock argument.

     When a shared lock is set on a  segment  of  a  file,  other
     processes  will  be able to 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 portion of the pro-
     tected area. A request for a shared lock will  fail  if  the
     file descriptor was not opened with read access.

     An exclusive lock will prevent any other process  from  set-
     ting  a  shared  lock or an exclusive lock on any portion of
     the protected area. A request for  an  exclusive  lock  will
     fail  if  the  file  descriptor  was  not  opened with write
     access.

     The flock structure contains at  least  the  following  ele-
     ments:

     short   l_type;       /* lock operation type */
     short   l_whence;     /* lock base indicator */
     off_t   l_start;      /* starting offset from base */
     off_t   l_len;        /* lock length; l_len == 0 means
                              until end of file */
     int     l_sysid;      /* system ID running process holding lock */
     pid_t   l_pid;        /* process ID of process holding lock */

     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. The value of l_len may be
     negative  (where  the  definition  of off_t permits negative
     values of l_len). After a successful  F_GETLK  or  F_GETLK64
     request,  that  is, one in which a lock was found, the value
     of l_whence will be SEEK_SET.

     The l_pid and l_sysid fields are used only with  F_GETLK  or
     F_GETLK64  to return the process ID of the process holding a
     blocking lock  and to indicate which system is running  that
     process.

     If l_len is positive, the area affected  starts  at  l_start
     and  ends  at l_start + l_len - 1. If l_len is negative, the
     area affected starts at l_start + l_len and ends at  l_start
     -  1. Locks may start and extend beyond the current end of a
     file, but must not be negative relative to the beginning  of
     the file. A lock will be set to extend to the largest possi-
     ble value of the file offset for that file by setting  l_len
     to  0. If such a lock also has l_start set to 0 and l_whence
     is set to SEEK_SET, the whole file will be locked.
     If a process has an existing lock in which l_len  is  0  and
     which  includes  the last byte of the requested segment, and
     an unlock (F_UNLCK) request is made in which l_len  is  non-
     zero  and  the offset of the last byte of the requested seg-
     ment is the maximum value for an object of type off_t,  then
     the  F_UNLCK  request will be treated as a request to unlock
     from the start of the requested segment with an l_len  equal
     to  0.   Otherwise,  the request will attempt to unlock only
     the requested segment.

     There will be at most one type of lock set for each byte  in
     the  file.  Before  a  successful  return  from  an F_SETLK,
     F_SETLK64, F_SETLKW, or F_SETLKW64 request when the  calling
     process has previously existing locks on bytes in the region
     specified by the request, the previous lock  type  for  each
     byte  in  the  specified  region will be replaced by the new
     lock type. As specified  above  under  the  descriptions  of
     shared  locks  and  exclusive  locks, an F_SETLK, F_SETLK64,
     F_SETLKW, or F_SETLKW64 request will (respectively) fail  or
     block  when  another  process has existing locks on bytes in
     the specified region and the type of any of those locks con-
     flicts with the type specified in the request.

     All locks associated with a file for  a  given  process  are
     removed  when  a  file descriptor for that file is closed by
     that process or the process  holding  that  file  descriptor
     terminates.  Locks  are  not  inherited  by  a child process
     created using fork(2).

     A potential for deadlock occurs if a process  controlling  a
     locked  region is put to sleep by attempting to lock another
     process' locked region. If the system detects that  sleeping
     until  a  locked  region is unlocked would cause a deadlock,
     fcntl() will fail with an  EDEADLK error.

     The following values for cmd are used for file share  reser-
     vations.  A share reservation is placed on an entire file to
     allow cooperating processes to control access to the file.

     F_SHARE
           Sets a share reservation on a file with the  specified
           access  mode  and  designates which types of access to
           deny.

     F_UNSHARE
           Remove an existing share reservation.

     File share reservations are an advisory form of access  con-
     trol  among  cooperating processes, on both local and remote
     machines. They are  most often used by  DOS or Windows  emu-
     lators  and   DOS  based  NFS clients.  However, native UNIX
     versions of  DOS or Windows applications may also choose  to
     use this form of access control.

     A share reservation is described  by  an   fshare  structure
     defined in <sys/fcntl.h>, which is included in  <fcntl.h> as
     follows:

     typedef struct fshare {
             short   f_access;
             short   f_deny;
             int     f_id;
     } fshare_t;

     A share reservation specifies the type of access,  f_access,
     to  be requested on the open file descriptor.   If access is
     granted, it further specifies what type of  access  to  deny
     other  processes,  f_deny. A single process on the same file
     may hold multiple non-conflicting
      reservations by specifying an identifier,  f_id, unique  to
     the process, with each request.

     An F_UNSHARE  request  releases  the  reservation  with  the
     specified   f_id.  The   f_access  and   f_deny  fields  are
     ignored.

     Valid  f_access values are:

     F_RDACC
           Set a file share reservation for read-only access.

     F_WRACC
           Set a file share reservation for write-only access.

     F_RWACC
           Set a  file  share  reservation  for  read  and  write
           access.

     Valid  f_deny values are:

     F_COMPAT
           Set a file share reservation to compatibility mode.

     F_RDDNY
           Set a file share reservation to deny  read  access  to
           other processes.

     F_WRDNY
           Set a file share reservation to deny write  access  to
           other processes.

     F_RWDNY
           Set a file share reservation to deny  read  and  write
           access to other processes.

     F_NODNY
           Do not deny read or write access to any other process.


RETURN VALUES

     Upon successful completion, the value  returned  depends  on
     cmd as follows:

     F_DUPFD
           A new file descriptor.

     F_FREESP
           Value of 0.

     F_GETFD
           Value of flags defined in <fcntl.h>. The return  value
           will not be negative.

     F_GETFL
           Value of file  status  flags  and  access  modes.  The
           return value will not be negative.

     F_GETLK
           Value other than -1.

     F_GETLK64
           Value other than -1.

     F_GETOWN
           Value of the socket owner process  or  process  group;
           this will not be -1.

     F_GETXFL
           Value of file status flags, access modes, and creation
           and  assignment  flags.  The  return value will not be
           negative.

     F_SETFD
           Value other than -1.

     F_SETFL
           Value other than -1.

     F_SETLK
           Value other than -1.

     F_SETLK64
           Value other than -1.

     F_SETLKW
           Value other than -1.

     F_SETLKW64
           Value other than -1.

     F_SETOWN
           Value other than -1.

     F_SHARE
           Value other than  -1.

     F_UNSHARE
           Value other than  -1.

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


ERRORS

     The fcntl() function will fail if:

     EAGAIN
           The cmd argument is F_SETLK or F_SETLK64, the type  of
           lock  (l_type)  is  a  shared  (F_RDLCK)  or exclusive
           (F_WRLCK) lock, 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 seg-
           ment  of  a file to be locked is already shared-locked
           or exclusive-locked by another process.

           The  cmd argument is F_FREESP, the file exists, manda-
           tory  file/record  locking  is set, and there are out-
           standing record locks on the file; or the cmd argument
           is F_SETLK, F_SETLK64, F_SETLKW, or F_SETLKW64, manda-
           tory file/record locking  is  set,  and  the  file  is
           currently   being   mapped  to  virtual  memory  using
           mmap(2).

           The cmd argument is F_SHARE  and   f_access  conflicts
           with an existing  f_deny share reservation.

     EBADF The fildes argument is not a valid open file  descrip-
           tor;  or  the   cmd  argument  is  F_SETLK, F_SETLK64,
           F_SETLKW, or F_SETLKW64, the type of lock, l_type,  is
           a  shared  lock  (F_RDLCK),  and fildes is not a valid
           file descriptor open for reading; or the type of  lock
           l_type  is  an  exclusive lock (F_WRLCK) and fildes is
           not a valid file descriptor open for writing.

           The  cmd argument is F_FREESP  and  fildes  is  not  a
           valid file descriptor open for writing.

           The cmd argument is  F_DUP2FD, and arg is negative  or
           is  not  less  than  the  current  resource  limit for
           RLIMIT_NOFILE.
           The cmd  argument  is  F_SHARE,  the   f_access  share
           reservation  is for write access, and  fildes is not a
           valid file descriptor open for writing.

           The cmd argument is F_SHARE, the f_access share reser-
           vation  is for read access, and  fildes is not a valid
           file descriptor open for reading.

     EFAULT
           The  cmd  argument  is  F_GETLK,  F_GETLK64,  F_SETLK,
           F_SETLK64,  F_SETLKW,  F_SETLKW64, or F_FREESP and the
           arg argument points to an illegal address.

           The cmd argument is   F_SHARE  or  F_UNSHARE  and  arg
           points to an illegal address.

     EINTR The cmd argument is F_SETLKW  or  F_SETLKW64  and  the
           function was interrupted by a signal.

     EINVAL
           The cmd argument is invalid; or the  cmd  argument  is
           F_DUPFD  and  arg is negative or greater than or equal
           to  OPEN_MAX;  or  the  cmd   argument   is   F_GETLK,
           F_GETLK64, F_SETLK, F_SETLK64, F_SETLKW, or F_SETLKW64
           and the data pointed to by arg is not valid; or fildes
           refers to a file that does not support locking.

           The cmd argument is F_UNSHARE and a  reservation  with
           this  f_id for this process does not exist.

     EIO   An I/O error occurred while reading from or writing to
           the file system.

     EMFILE
           The  cmd argument is F_DUPFD and either  OPEN_MAX file
           descriptors are currently open in the calling process,
           or no file descriptors greater than or  equal  to  arg
           are available.

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

     ENOLINK
           Either the  fildes argument is on a remote machine and
           the  link  to that machine is no longer active; or the
           cmd argument is F_FREESP, the  file  is  on  a  remote
           machine,  and  the  link  to that machine is no longer
           active.

     EOVERFLOW
           One of the values to be returned cannot be represented
           correctly.

           The cmd argument is F_GETLK, F_SETLK, or F_SETLKW  and
           the  smallest  or,  if l_len is non-zero, the largest,
           offset of any byte in the requested segment cannot  be
           represented correctly in an object of type off_t.

           The  cmd  argument   is   F_GETLK64,   F_SETLK64,   or
           F_SETLKW64  and the smallest or, if l_len is non-zero,
           the largest, offset of any byte in the requested  seg-
           ment  cannot  be represented correctly in an object of
           type off64_t.

     The fcntl() function may fail if:

     EAGAIN
           The cmd argument is F_SETLK, F_SETLK64,  F_SETLKW,  or
           F_SETLKW64,  and the file is currently being mapped to
           virtual memory using mmap(2).

     EDEADLK
           The cmd argument is F_SETLKW or F_SETLKW64,  the  lock
           is  blocked by some lock from another process and put-
           ting the calling process to sleep,  waiting  for  that
           lock to become free would cause a deadlock.

           The cmd argument is F_FREESP, mandatory record locking
           is  enabled,  O_NDELAY  and O_NONBLOCK are clear and a
           deadlock condition was detected.


ATTRIBUTES

     See attributes(5) for descriptions of the  following  attri-
     butes:

     ____________________________________________________________
    |       ATTRIBUTE TYPE        |       ATTRIBUTE VALUE       |
    |_____________________________|_____________________________|
    | MT-Level                    | Async-Signal Safe           |
    |_____________________________|_____________________________|


SEE ALSO

     lockd(1M), chmod(2), close(2),  creat(2),  dup(2),  exec(2),
     fork(2),  mmap(2),  open(2), pipe(2), read(2), sigaction(2),
     write(2), dup2(3C), attributes(5), fcntl(3HEAD)

     Programming Interfaces Guide


NOTES


     In the past, the variable errno was  set  to  EACCES  rather
     than  EAGAIN  when  a section of a file is already locked by
     another process. Therefore,  portable  application  programs
     should expect and test for either value.

     Advisory locks allow cooperating processes to  perform  con-
     sistent  operations on files, but do not guarantee exclusive
     access. Files can be accessed without  advisory  locks,  but
     inconsistencies may result. The network share locking proto-
     col does not support the f_deny value of F_COMPAT. For  net-
     work  file  systems,   if   f_access  is  F_RDACC, f_deny is
     mapped to F_RDDNY. Otherwise, it is mapped to F_RWDNY.

     To prevent possible file corruption, the system  may  reject
     mmap()  requests for advisory locked files, or it may reject
     advisory locking requests for  mapped  files.   Applications
     that  require  a  file be both locked and mapped should lock
     the entire file (l_start and l_len both set  to  0).   If  a
     file  is  mapped,  the  system may reject an unlock request,
     resulting in a lock that does not cover the entire file.

     If the file server crashes and has to be rebooted, the  lock
     manager  (see  lockd(1M)) attempts to recover all locks that
     were associated with that  server.   If  a  lock  cannot  be
     reclaimed,  the  process  that  held  the  lock  is issued a
     SIGLOST signal.


Man(1) output converted with man2html