HP 3000 Manuals

fcntl [ MPE/iX Developer's Kit Reference Manual Volume I ] MPE/iX 5.0 Documentation


MPE/iX Developer's Kit Reference Manual Volume I

fcntl 

File control.

Syntax 

     #include <sys/types.h>
     #include <unistd.h>
     #include <fcntl.h>
     int fcntl(int *fildes, int cmd, ...);

Parameters 

fildes     An open file descriptor.

cmd        The following values can be used for the file control command.

           F_DUPFD          Duplicate file descriptor.

           F_GETFD          Get file descriptor flags.

           F_GETLK          Get record locking information.

           F_SETFD          Set file descriptor flags.

           F_GETFL          Get file status flags.

           F_SETFL          Set file status flags.

           F_SETLK          Set record locking information.

           F_SETLKW         Set record locking information;wait if
                            blocked.

           FD_CLOEXEC       Close file descriptor upon execution of an
                            exec-family function.

           l_type Values for Record Locking With fcntl() 

           F_RDLCK          Shared or read lock.

           F_UNLCK          Unlock.

           F_WRLCK          Exclusive or write lock.

           oflag Values for open() 

           O_CREAT          Create file if it does not exist.

           O_EXCL           Exclusive use flag.

           O_NOCITY         Do not assign a controlling terminal.

           O_TRUNC          Truncate flag.

           File Status Flags Used for open() and fcntl() 

           O_APPEND         Set append mode.

           O_NONBLOCK       No delay.

           File Access Modes Used for open() and fcntl() 

           O_RDONLY         Open for reading only.

           O_RDWR           Open for reading and writing.

           O_WRONLY         Open for writing only.

           Mask for Use With File Access Modes 

           O_ACCMODE        Mask for file access modes.

Return Values 

>=0        Success.  A nonnegative integer is returned representing the
           lowest numbered file descriptor not open by the calling
           process.

-1         An error occurred.  The file is not opened, and errno is set
           to indicate the error condition.

Description 

Upon successful completion, the value returned will depend on cmd.  The
various return values are shown in Table 6-9.

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

The available values for cmd are defined in the <fcntl.h> (see 6.5.1)
which will include:

F_DUPFD       Return a new file descriptor that is the lowest numbered
              avaliable file descriptor greater than or equal to the
              third argument, arg, taken as an integer of type int.  The
              new file descriptor refers to the same open file
              description as the original file descriptor and shares any
              locks.

              The FD_CLOEXEC flag associated with the new file descriptor
              cleared to keep the file open across calls to the exec 
              family of functions.

F_GETFD       Get the file descriptor flags that are associated with the
              file descriptor fildes.  File descriptor flags are
              associated with a single file descriptor and do not affect
              other file descriptors that refer to the same file.

F_GETLK

F_SETFD       Set the file descriptor flags that are associated with
              fildes to the third argument, arg taken as type int.  If
              the FD_CLOEXEC flag is zero, the file will be closed upon
              successful execution of an exec function.

F_GETFL       Get the file status flags and the file access modes for the
              open file description associated with 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 are associated with the
              open file description and do not affect other file
              descriptors that refer to the same file with different open
              file descriptions.

F_SETFL       Set the file status flags for the open file description
              associated with fildes from the corresponding bits in the
              third argument, arg, taken as type int.  Bits corresponding
              to the file access modes and the oflag values that are set
              in arg are ignored.  If any bits in arg other than those
              mentioned here are changed by the application, the result
              is unspecified.

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

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

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 (see below).  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 by the <fcntl.h> header.  If shared or
              exclusive lock cannot be set, fcntl() will return
              immediately.

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 satisfied.  If a signal
              that is to be caught is received while fcntl will be
              interrupted.  Upon return from the signal handler of the
              process, fcntl() will return -1 with errno set to [EINTR],
              and the lock operation will not be done.

The flock structure, defined by the <fcntl.h> header, describes an
advisory lock.  It includes the members shown in Table 6-8.

When a shared lock has been 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 protected 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 setting 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 value of l_whence is DEEK_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_en is the number of consecutive bytes to be locked.  If l_len is
negative, the result is undefined.  The l_pid field is only used with
F_GETLK to return the process ID of the process holeing a blocking lock.
After a successful F_GETLK request, the value of l_whence will be
SEEK_SET.

          flock Structure 

       Member Type               Member Name                   Description 
short                     l_type                    F_RDLCK,F_WRLCK,or F_UNLCK.
short                     l_whence                  Flag for starting offset.
off_t                     l_start                   Relative offset in bytes.
off_t                     l_len                     Size;if 0,then until EOF.
pid_t                     l_pid                     Process ID of the process holding
                                                    the lock, returned with F_GETLK.

Locks may start and extend beyond the current end of a file, but, will
not start or extend before the beginning of the file.  A lock will be set
to extend to the largest possible value of the file offset for that file
is l_len is set to zero.  If the flock struct has l_whence and l_start 
that point to the beginning of the file, and l_len of zero, the intire
file will be locked.

There will be at most one type of lock set for each byte in the file.
Before a successful return from an F_SETLK or an F_SETLKW 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, and
F_SETLK of an F_SETLKW 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 conflicts with the type specified in the
request.

All locks associated with a file for a given process will be 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 useing the fork() function.

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

Description 

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

Implementation Considerations 

The calling process must have the correct access permissions as defined
by either an attached ACD or by the MPE/iX file security matrix.  For
example, a file opened O_RDONLY must have either ACD read access or
MPE/iX read access.  A file opened O_WRONLY or O_RDWR must have either
ACD write access and append access or MPE/iX write access and append
access.

Errors 

If an error occurs, errno is set to one of the following values:

EACCES            CAUSE           One of the following:
                                     *   The calling process does not have search
                                         permission to a component of the pathname.
                                     *   The file does not exist and the calling
                                         process does not have write permission to the
                                         parent directory of the file to be created.
                                     *   The file exists and the permissions specified
                                         by oflag are denied.
                                     *   Both O_TRUNC and O_RDONLY were specified.
                                     *   Both O_APPEND and O_RDONLY were specified.
                                     *   An MPE/iX lockword is associated with the
                                         file.
                  ACTION          One of the following:
                                     *   Make sure that the calling process has search
                                         permission to all directory components of the
                                         pathname.
                                     *   Make sure that the calling process has write
                                         permission to the parent directory of the file
                                         to be created.
                                     *   Specify valid and compatible flags in oflag.
                                     *   Remove the MPE/iX lockword.

          Table 4-0.  (cont.) 

EBADF             CAUSE           The fildes argument is not a valid file descriptor.
                                  The argument cmd is F_SETLK or F_SETLKW, the type of
                                  lock (l_type) is shared lock(F_RDLCK), and fildes 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_WLRCK), and
                                  fildes is not a valid file descriptor open for
                                  writing.
                  ACTION          None.

EINTR             CAUSE           The argument cmd is F_SETLKW, and the function was
                                  interrupted by a signal.
                  ACTION          None.

EINVAL            CAUSE           More than one of the following three open flags were
                                  specified in oflag:  O_WRONLY, O_RDONLY, and O_RDWR.
                  ACTION          Specify only one of the open flags in oflag.

EMFILE            CAUSE           The argument cmd if F_DUPED and {OPEN_MAX} file
                                  descriptors are currently in use by this process, or
                                  no file descriptors greater than or equal to arg are
                                  available.
                  ACTION          None.

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

For each of the following conditions, if the condition is detected, the
fcntl() function will return -1 and set errno to the corresponding value:

EDEADLK           CAUSE           The argument cmd is F_SETLKW, and a deadlock
                                  condition was detected.
                  ACTION          None.

EAGAIN            CAUSE           The system lacked the resources to create another
                                  process.
                  ACTION          Attempt process creation at a later time, or decrease
                                  the number of processes associated with the
                                  application.

EPERM             CAUSE           One of the following:
                                     *   The calling process does not have the MPE/iX
                                         process handling (PH) capability.
                                     *   The calling process has outstanding switches
                                         to CM code, has set critical mode, has
                                         outstanding NOWAITIO, or is holding an
                                         operating system internal resource.
                  ACTION          One of the following:
                                     *   Link the program file with the MPE/iX PH
                                         capability.
                                     *   Do not execute execl() when the calling
                                         process has outstanding switches to CM code,
                                         has set critical mode, has outstanding
                                         NOWAITIO, or is holding an operating system
                                         internal resource.

See Also 

close(), exec(), open(), <fcntl.h>, (POSIX.1).



MPE/iX 5.0 Documentation