📄 fcntl.2
字号:
.\" Copyright (c) 1983, 1993.\" The Regents of the University of California. All rights reserved..\".\" Redistribution and use in source and binary forms, with or without.\" modification, are permitted provided that the following conditions.\" are met:.\" 1. Redistributions of source code must retain the above copyright.\" notice, this list of conditions and the following disclaimer..\" 2. Redistributions in binary form must reproduce the above copyright.\" notice, this list of conditions and the following disclaimer in the.\" documentation and/or other materials provided with the distribution..\" 3. All advertising materials mentioning features or use of this software.\" must display the following acknowledgement:.\" This product includes software developed by the University of.\" California, Berkeley and its contributors..\" 4. Neither the name of the University nor the names of its contributors.\" may be used to endorse or promote products derived from this software.\" without specific prior written permission..\".\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION).\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF.\" SUCH DAMAGE..\".\" @(#)fcntl.2 8.2 (Berkeley) 1/12/94.\".Dd January 12, 1994.Dt FCNTL 2.Os BSD 4.2.Sh NAME.Nm fcntl.Nd file control.Sh SYNOPSIS.Fd #include <fcntl.h>.Ft int.Fn fcntl "int fd" "int cmd" "int arg".Sh DESCRIPTION.Fn Fcntlprovides for control over descriptors.The argument.Fa fdis a descriptor to be operated on by.Fa cmdas follows:.Bl -tag -width F_GETOWNX.It Dv F_DUPFDReturn a new descriptor as follows:.Pp.Bl -bullet -compact -offset 4n.ItLowest numbered available descriptor greater than or equal to.Fa arg ..ItSame object references as the original descriptor..ItNew descriptor shares the same file offset if the objectwas a file..ItSame access mode (read, write or read/write)..ItSame file status flags (i.e., both file descriptorsshare the same file status flags)..ItThe close-on-exec flag associated with the new file descriptoris set to remain open across.Xr execv 2system calls..El.It Dv F_GETFDGet the close-on-exec flag associated with the file descriptor.Fa fd .If the low-order bit of the returned value is 0,the file will remain open across.Fn exec ,otherwise the file will be closed upon execution of.Fn exec.Fa ( argis ignored)..It Dv F_SETFDSet the close-on-exec flag associated with.Fa fdto the low order bit of.Fa arg(0 or 1 as above)..It Dv F_GETFLGet descriptor status flags, as described below.Fa ( argis ignored)..It Dv F_SETFLSet descriptor status flags to.Fa arg ..It Dv F_GETOWNGet the process ID or process groupcurrently receiving.Dv SIGIOand.Dv SIGURGsignals; process groups are returnedas negative values.Fa ( argis ignored)..It Dv F_SETOWNSet the process or process groupto receive.Dv SIGIOand.Dv SIGURGsignals;process groups are specified by supplying.Fa argas negative, otherwise .Fa argis interpreted as a process ID..El.PpThe flags for the.Dv F_GETFLand.Dv F_SETFLflags are as follows:.Bl -tag -width O_NONBLOCKX.It Dv O_NONBLOCKNon-blocking I/O; if no data is available to a.Xr readcall, or if a.Xr writeoperation would block,the read or write call returns -1 with the error.Er EAGAIN ..It Dv O_APPENDForce each write to append at the end of file;corresponds to the.Dv O_APPENDflag of.Xr open 2 ..It Dv O_ASYNCEnable the.Dv SIGIOsignal to be sent to the process groupwhen I/O is possible, e.g.,upon availability of data to be read..El.PpSeveral commands are available for doing advisory file locking;they all operate on the following structure:.ne 7v.Bd -literalstruct 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 */};.EdThe commands available for advisory record locking are as follows:.Bl -tag -width F_SETLKWX.It Dv F_GETLKGet the first lock that blocks the lock description pointed to by thethird argument,.Fa arg ,taken as a pointer to a.Fa "struct flock"(see above).The information retrieved overwrites the information passed to.Nm fcntlin the.Fa flockstructure.If no lock is found that would prevent this lock from being created,the structure is left unchanged by this function call except for thelock type which is set to.Dv F_UNLCK ..It Dv F_SETLKSet or clear a file segment lock according to the lock descriptionpointed to by the third argument,.Fa arg ,taken as a pointer to a.Fa "struct flock"(see above)..Dv F_SETLKis used to establish shared (or read) locks.Dv (F_RDLCK)or exclusive (or write) locks,.Dv (F_WRLCK) ,as well as remove either type of lock.Dv (F_UNLCK) .If a shared or exclusive lock cannot be set,.Nm fcntlreturns immediately with.Er EACCES ..It Dv F_SETLKWThis command is the same as.Dv F_SETLKexcept 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.Nm fcntlis waiting for a region, the.Nm fcntlwill be interrupted if the signal handler has not specified the.Dv SA_RESTART(see.Xr sigaction 2 ) ..El.PpWhen a shared lock has been set on a segment of a file,other processes can set shared locks on that segmentor a portion of it.A shared lock prevents any other process from setting an exclusivelock on any portion of the protected area.A request for a shared lock fails if the file descriptor was notopened with read access..PpAn exclusive lock prevents any other process from setting a shared lock oran exclusive lock on any portion of the protected area.A request for an exclusive lock fails if the file was notopened with write access..PpThe value of.Fa l_whenceis.Dv SEEK_SET ,.Dv SEEK_CUR ,or.Dv SEEK_ENDto indicate that the relative offset,.Fa l_startbytes, will be measured from the start of the file,current position, or end of the file, respectively.The value of.Fa l_lenis the number of consecutive bytes to be locked.If.Fa l_lenis negative, the result is undefined.The.Fa l_pidfield is only used with.Dv F_GETLKto return the process ID of the process holding a blocking lock.After a successful.Dv F_GETLKrequest, the value of.Fa l_whenceis.Dv SEEK_SET ..PpLocks 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 thefile offset for that file if.Fa l_lenis set to zero. If.Fa l_whenceand.Fa l_startpoint to the beginning of the file, and.Fa l_lenis zero, the entire file is locked.If an application wishes only to do entire file locking, the.Xr flock 2system call is much more efficient..PpThere is at most one type of lock set for each byte in the file.Before a successful return from an.Dv F_SETLKor an.Dv F_SETLKWrequest when the calling process has previously existing lockson bytes in the region specified by the request,the previous lock type for each byte in the specifiedregion is replaced by the new lock type.As specified above under the descriptionsof shared locks and exclusive locks, an.Dv F_SETLKor an.Dv F_SETLKWrequest fails or blocks respectively when another process has existinglocks on bytes in the specified region and the type of any of thoselocks conflicts with the type specified in the request..PpThis interface follows the completely stupid semantics of System V and.St -p1003.1-88that require that all locks associated with a file for a given process areremoved when \fIany\fP file descriptor for that file is closed by that process.This semantic means that applications must be aware of any files thata subroutine library may access.For example if an application for updating the password file locks thepassword file database while making the update, and then calls.Xr getpwname 3to retrieve a record,the lock will be lost because .Xr getpwname 3opens, reads, and closes the password database.The database close will release all locks that the process hasassociated with the database, even if the library routine neverrequested a lock on the database.Another minor semantic problem with this interface is thatlocks are not inherited by a child process created using the.Xr fork 2function.The.Xr flock 2interface has much more rational last close semantics andallows locks to be inherited by child processes..Xr Flock 2is recommended for applications that want to ensure the integrityof their locks when using library routines or wish to pass locksto their children.Note that .Xr flock 2and .Xr fcntl 2locks may be safely used concurrently..PpAll locks associated with a file for a given process areremoved when the process terminates..PpA potential for deadlock occurs if a process controlling a locked regionis put to sleep by attempting to lock the locked region of another process.This implementation detects that sleeping until a locked region is unlockedwould cause a deadlock and fails with an.Er EDEADLKerror..Sh RETURN VALUESUpon successful completion, the value returned depends on.Fa cmdas follows:.Bl -tag -width F_GETOWNX -offset indent.It Dv F_DUPFDA new file descriptor..It Dv F_GETFDValue of flag (only the low-order bit is defined)..It Dv F_GETFLValue of flags..It Dv F_GETOWNValue of file descriptor owner..It otherValue other than -1..El.PpOtherwise, a value of -1 is returned and.Va errnois set to indicate the error..Sh ERRORS.Fn Fcntlwill fail if:.Bl -tag -width Er.It Bq Er EACCESThe argument.Fa argis.Dv F_SETLK ,the type of lock.Fa (l_type)is a shared lock.Dv (F_RDLCK)or exclusive lock.Dv (F_WRLCK) ,and the segment of a file to be locked is alreadyexclusive-locked by another process;or the type is an exclusive lock and some portion of thesegment of a file to be locked is already shared-locked orexclusive-locked by another process..It Bq Er EBADF.Fa Fildesis not a valid open file descriptor..PpThe argument.Fa cmdis.Dv F_SETLKor.Dv F_SETLKW ,the type of lock.Fa (l_type)is a shared lock.Dv (F_RDLCK) ,and.Fa fildesis not a valid file descriptor open for reading..PpThe argument.Fa cmdis.Dv F_SETLKor.Dv F_SETLKW ,the type of lock.Fa (l_type)is an exclusive lock.Dv (F_WRLCK) ,and.Fa fildesis not a valid file descriptor open for writing..It Bq Er EMFILE.Fa Cmdis.Dv F_DUPFDand the maximum allowed number of file descriptors are currentlyopen..It Bq Er EDEADLKThe argument.Fa cmdis.Dv F_SETLKW ,and a deadlock condition was detected..It Bq Er EINTRThe argument.Fa cmdis.Dv F_SETLKW ,and the function was interrupted by a signal..It Bq Er EINVAL.Fa Cmdis.Dv F_DUPFDand.Fa argis negative or greater than the maximum allowable number(see.Xr getdtablesize 2 ) ..PpThe argument.Fa cmdis.Dv F_GETLK ,.Dv F_SETLK ,or.Dv F_SETLKWand the data to which.Fa argpoints is not valid, or.Fa fildesrefers to a file that does not support locking..It Bq Er EMFILEThe argument.Fa cmdis.Dv F_DUPEDand the maximum number of file descriptors permitted for theprocess are already in use,or no file descriptors greater than or equal to.Fa argare available..It Bq Er ENOLCKThe argument.Fa cmdis.Dv F_SETLKor.Dv F_SETLKW ,and satisfying the lock or unlock request would result in thenumber of locked regions in the system exceeding a system-imposed limit..It Bq Er ESRCH.Fa Cmdis.Dv F_SETOWNandthe process ID given as argument is not in use..El.Sh SEE ALSO.Xr close 2 ,.Xr execve 2 ,.Xr flock 2 ,.Xr getdtablesize 2 ,.Xr open 2 ,.Xr sigvec 2.Sh HISTORYThe.Nmfunction call appeared in.Bx 4.2 .
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -