a9dd9784d1
minix-vmd specificness of F_FREESP as minix now implements it too.
262 lines
6.1 KiB
Groff
262 lines
6.1 KiB
Groff
.TH FCNTL 2
|
|
.SH NAME
|
|
fcntl \- miscellaneous file descriptor control functions
|
|
.SH SYNOPSIS
|
|
.nf
|
|
.ft B
|
|
#include <fcntl.h>
|
|
|
|
int fcntl(int \fIfd\fP, int \fIcmd\fP, \fR[\fP\fIdata\fP\fR]\fP)
|
|
.ft P
|
|
.fi
|
|
.SH DESCRIPTION
|
|
.de SP
|
|
.if t .sp 0.4
|
|
.if n .sp
|
|
..
|
|
.B Fcntl()
|
|
performs several file descriptor related functions, like duplicating a file
|
|
descriptor, setting the "close on exec" attribute, etc. The
|
|
.I fd
|
|
argument is the file descriptor to operate on,
|
|
.I cmd
|
|
is the command code of the operation to perform, and
|
|
.I data
|
|
is an optional argument to give or receive parameters. The command
|
|
codes and other symbols and types are declared in <fcntl.h>. The commands
|
|
are:
|
|
.SP
|
|
.BI "fcntl(" fd ", F_DUPFD, int " fd2 ")"
|
|
.RS
|
|
Returns a new file descriptor that is a duplicate of file descriptor
|
|
.IR fd .
|
|
It shares the same file pointer and the same file status flags, but has
|
|
separate file descriptor flags that are initially off. The value of the
|
|
duplicate file descriptor is the first free file descriptor greater than
|
|
or equal to
|
|
.IR fd2 .
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_GETFD)"
|
|
.RS
|
|
Returns the file descriptor flags associated with file descriptor
|
|
.IR fd .
|
|
The flags are the "close on exec" flag
|
|
.B FD_CLOEXEC
|
|
that, when set, causes the file descriptor to be closed when the process
|
|
executes another program. The Minix-vmd specific
|
|
.B FD_ASYNCHIO
|
|
flag marks a file descriptor for asynchronous I/O operation.
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_SETFD, int " flags ")"
|
|
.RS
|
|
Set the file descriptor flags of
|
|
.I fd
|
|
to
|
|
.IR flags .
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_GETFL)"
|
|
.RS
|
|
Return the file status flags and file access modes associated with the file
|
|
associated with file descriptor
|
|
.IR fd .
|
|
The file status flags are
|
|
.B O_NONBLOCK
|
|
(non blocking I/O) and
|
|
.B O_APPEND
|
|
(append mode). The file access modes are
|
|
.B O_RDONLY
|
|
(read-only),
|
|
.B O_WRONLY
|
|
(write-only) and
|
|
.B O_RDWR
|
|
(read-write). These flags are also used in the second argument of
|
|
.BR open (2).
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_SETFL, int " flags ")"
|
|
.RS
|
|
Set the file status flags of the file referenced by
|
|
.I fd
|
|
to
|
|
.IR flags .
|
|
Only
|
|
.B O_NONBLOCK
|
|
and
|
|
.B O_APPEND
|
|
may be changed. Access mode flags are ignored.
|
|
.RE
|
|
.SP
|
|
The next four commands use a parameter of type
|
|
.B struct flock
|
|
that is defined in <fcntl.h> as:
|
|
.SP
|
|
.RS
|
|
.nf
|
|
.ta +4n +8n +12n
|
|
struct flock {
|
|
short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */
|
|
short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
|
|
off_t l_start; /* byte offset to start of segment */
|
|
off_t l_len; /* length of segment */
|
|
pid_t l_pid; /* process id of the locks' owner */
|
|
};
|
|
.fi
|
|
.RE
|
|
.SP
|
|
This structure describes a segment of a file.
|
|
.B L_type
|
|
is the lock operation performed on the file segment:
|
|
.B F_RDLCK
|
|
to set a read lock,
|
|
.B F_WRLCK
|
|
to set a write lock, and
|
|
.B F_UNLCK
|
|
to remove a lock. Several processes may have a read lock on a segment, but
|
|
only one process can have a write lock.
|
|
.B L_whence
|
|
tells if the
|
|
.B l_start
|
|
offset must be interpreted from the start of the file
|
|
.RB ( SEEK_SET ),
|
|
the current file position
|
|
.RB ( SEEK_CUR ),
|
|
or the end of the file
|
|
.RB ( SEEK_END ).
|
|
This is analogous to the third parameter of
|
|
.BR lseek (2).
|
|
These
|
|
.B SEEK_*
|
|
symbols are declared in <unistd.h>.
|
|
.B L_start
|
|
is the starting offset of the segment of the file.
|
|
.B L_end
|
|
is the length of the segment. If zero then the segment extends until end of
|
|
file.
|
|
.B L_pid
|
|
is the process-id of the process currently holding a lock on the segment.
|
|
It is returned by
|
|
.BR F_GETLK .
|
|
.SP
|
|
.BI "fcntl(" fd ", F_GETLK, struct flock *" lkp ")"
|
|
.RS
|
|
Find out if some other process has a lock on a segment of the file
|
|
associated by file descriptor
|
|
.I fd
|
|
that overlaps with the segment described by the
|
|
.B flock
|
|
structure pointed to by
|
|
.IR lkp .
|
|
If the segment is not locked then
|
|
.B l_type
|
|
is set to
|
|
.BR F_UNLCK .
|
|
Otherwise an
|
|
.B flock
|
|
structure is returned through
|
|
.I lkp
|
|
that describes the lock held by the other process.
|
|
.B L_start
|
|
is set relative to the start of the file.
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_SETLK, struct flock *" lkp ")"
|
|
.RS
|
|
Register a lock on a segment of the file associated with file descriptor
|
|
.IR fd .
|
|
The file segment is described by the
|
|
.B struct flock
|
|
pointed to by
|
|
.IR lkp .
|
|
This call returns an error if any part of the segment is already locked.
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_SETLKW, struct flock *" lkp ")"
|
|
.RS
|
|
Register a lock on a segment of the file associated with file descriptor
|
|
.IR fd .
|
|
The file segment is described by the
|
|
.B struct flock
|
|
pointed to by
|
|
.IR lkp .
|
|
This call blocks waiting for the lock to be released if any part of the
|
|
segment is already locked.
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_FREESP, struct flock *" lkp ")"
|
|
.RS
|
|
This call frees a segment of disk space occupied by the
|
|
file associated with file descriptor
|
|
.IR fd .
|
|
The segment is described by the
|
|
.B struct flock
|
|
pointed to by
|
|
.IR lkp .
|
|
The file is truncated in length to the byte position indicated by
|
|
.B l_start
|
|
if
|
|
.B l_len
|
|
is zero. If
|
|
.B l_len
|
|
is nonzero then the file keeps its size, but the freed bytes now read as
|
|
zeros. (Other than sharing the flock structure, this call has nothing to do
|
|
with locking.) (This call is common among UNIX(-like) systems.)
|
|
.RE
|
|
.SP
|
|
.BI "fcntl(" fd ", F_SEEK, u64_t " pos ")"
|
|
.RS
|
|
This Minix-vmd specific call sets the file position of the file associated
|
|
with file descriptor
|
|
.I fd
|
|
to the byte offset indicated by the 64-bit number
|
|
.IR pos .
|
|
This is analogous to the call
|
|
.SP
|
|
.RS
|
|
.BI "lseek(" fd ", " pos ", SEEK_SET)"
|
|
.RE
|
|
.SP
|
|
except that
|
|
.B F_SEEK
|
|
can be used on devices larger than 4 gigabyte.
|
|
.RE
|
|
.SH "SEE ALSO"
|
|
.BR open (2),
|
|
.BR dup (2),
|
|
.BR lseek (2),
|
|
.BR ftruncate (3),
|
|
.BR int64 (3).
|
|
.SH DIAGNOSTICS
|
|
.B Fcntl
|
|
returns a file descriptor, flags, or
|
|
.B 0
|
|
to indicate success. On error
|
|
.B \-1
|
|
is returned, with
|
|
.B errno
|
|
set to the appropriate error code. The most notable errors are:
|
|
.TP 5
|
|
.B EINTR
|
|
If a blocked
|
|
.B F_SETLKW
|
|
operation is interrupted by a signal that is caught.
|
|
.TP
|
|
.B EAGAIN
|
|
By
|
|
.B F_SETLK
|
|
if a segment cannot be locked.
|
|
.TP
|
|
.B EBADF
|
|
A bad file descriptor in general, or an attempt to place a write lock on a
|
|
file that is not open for writing, etc.
|
|
.TP
|
|
.B ENOLCK
|
|
No locks available, the file system code has run out of internal table
|
|
space.
|
|
.SH AUTHOR
|
|
Kees J. Bot <kjb@cs.vu.nl>
|
|
|
|
.\"
|
|
.\" $PchId: fcntl.2,v 1.2 2000/08/11 19:39:51 philip Exp $
|