263 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			263 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 $
 |