🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 导航 - [索引](../genindex.xhtml "总目录") - [模块](../py-modindex.xhtml "Python 模块索引") | - [下一页](pipes.xhtml "pipes --- Interface to shell pipelines") | - [上一页](pty.xhtml "pty --- Pseudo-terminal utilities") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) » - zh\_CN 3.7.3 [文档](../index.xhtml) » - [Python 标准库](index.xhtml) » - [Unix 专有服务](unix.xhtml) » - $('.inline-search').show(0); | # [`fcntl`](#module-fcntl "fcntl: The fcntl() and ioctl() system calls. (Unix)") --- The `fcntl` and `ioctl` system calls - - - - - - This module performs file control and I/O control on file descriptors. It is an interface to the `fcntl()` and `ioctl()` Unix routines. For a complete description of these calls, see *fcntl(2)* and *ioctl(2)* Unix manual pages. All functions in this module take a file descriptor *fd* as their first argument. This can be an integer file descriptor, such as returned by `sys.stdin.fileno()`, or an [`io.IOBase`](io.xhtml#io.IOBase "io.IOBase") object, such as `sys.stdin`itself, which provides a [`fileno()`](io.xhtml#io.IOBase.fileno "io.IOBase.fileno") that returns a genuine file descriptor. 在 3.3 版更改: Operations in this module used to raise an [`IOError`](exceptions.xhtml#IOError "IOError") where they now raise an [`OSError`](exceptions.xhtml#OSError "OSError"). The module defines the following functions: `fcntl.``fcntl`(*fd*, *cmd*, *arg=0*)Perform the operation *cmd* on file descriptor *fd* (file objects providing a [`fileno()`](io.xhtml#io.IOBase.fileno "io.IOBase.fileno") method are accepted as well). The values used for *cmd* are operating system dependent, and are available as constants in the [`fcntl`](#module-fcntl "fcntl: The fcntl() and ioctl() system calls. (Unix)") module, using the same names as used in the relevant C header files. The argument *arg* can either be an integer value, or a [`bytes`](stdtypes.xhtml#bytes "bytes") object. With an integer value, the return value of this function is the integer return value of the C `fcntl()` call. When the argument is bytes it represents a binary structure, e.g. created by [`struct.pack()`](struct.xhtml#struct.pack "struct.pack"). The binary data is copied to a buffer whose address is passed to the C `fcntl()` call. The return value after a successful call is the contents of the buffer, converted to a [`bytes`](stdtypes.xhtml#bytes "bytes") object. The length of the returned object will be the same as the length of the *arg* argument. This is limited to 1024 bytes. If the information returned in the buffer by the operating system is larger than 1024 bytes, this is most likely to result in a segmentation violation or a more subtle data corruption. If the `fcntl()` fails, an [`OSError`](exceptions.xhtml#OSError "OSError") is raised. `fcntl.``ioctl`(*fd*, *request*, *arg=0*, *mutate\_flag=True*)This function is identical to the [`fcntl()`](#fcntl.fcntl "fcntl.fcntl") function, except that the argument handling is even more complicated. The *request* parameter is limited to values that can fit in 32-bits. Additional constants of interest for use as the *request* argument can be found in the [`termios`](termios.xhtml#module-termios "termios: POSIX style tty control. (Unix)") module, under the same names as used in the relevant C header files. The parameter *arg* can be one of an integer, an object supporting the read-only buffer interface (like [`bytes`](stdtypes.xhtml#bytes "bytes")) or an object supporting the read-write buffer interface (like [`bytearray`](stdtypes.xhtml#bytearray "bytearray")). In all but the last case, behaviour is as for the [`fcntl()`](#fcntl.fcntl "fcntl.fcntl")function. If a mutable buffer is passed, then the behaviour is determined by the value of the *mutate\_flag* parameter. If it is false, the buffer's mutability is ignored and behaviour is as for a read-only buffer, except that the 1024 byte limit mentioned above is avoided -- so long as the buffer you pass is at least as long as what the operating system wants to put there, things should work. If *mutate\_flag* is true (the default), then the buffer is (in effect) passed to the underlying [`ioctl()`](#fcntl.ioctl "fcntl.ioctl") system call, the latter's return code is passed back to the calling Python, and the buffer's new contents reflect the action of the [`ioctl()`](#fcntl.ioctl "fcntl.ioctl"). This is a slight simplification, because if the supplied buffer is less than 1024 bytes long it is first copied into a static buffer 1024 bytes long which is then passed to [`ioctl()`](#fcntl.ioctl "fcntl.ioctl") and copied back into the supplied buffer. If the `ioctl()` fails, an [`OSError`](exceptions.xhtml#OSError "OSError") exception is raised. 举个例子: ``` >>> import array, fcntl, struct, termios, os >>> os.getpgrp() 13341 >>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, " "))[0] 13341 >>> buf = array.array('h', [0]) >>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1) 0 >>> buf array('h', [13341]) ``` `fcntl.``flock`(*fd*, *operation*)Perform the lock operation *operation* on file descriptor *fd* (file objects providing a [`fileno()`](io.xhtml#io.IOBase.fileno "io.IOBase.fileno") method are accepted as well). See the Unix manual *flock(2)* for details. (On some systems, this function is emulated using `fcntl()`.) If the `flock()` fails, an [`OSError`](exceptions.xhtml#OSError "OSError") exception is raised. `fcntl.``lockf`(*fd*, *cmd*, *len=0*, *start=0*, *whence=0*)This is essentially a wrapper around the [`fcntl()`](#fcntl.fcntl "fcntl.fcntl") locking calls. *fd* is the file descriptor of the file to lock or unlock, and *cmd*is one of the following values: - `LOCK_UN` -- unlock - `LOCK_SH` -- acquire a shared lock - `LOCK_EX` -- acquire an exclusive lock When *cmd* is `LOCK_SH` or `LOCK_EX`, it can also be bitwise ORed with `LOCK_NB` to avoid blocking on lock acquisition. If `LOCK_NB` is used and the lock cannot be acquired, an [`OSError`](exceptions.xhtml#OSError "OSError") will be raised and the exception will have an *errno*attribute set to `EACCES` or `EAGAIN` (depending on the operating system; for portability, check for both values). On at least some systems, `LOCK_EX` can only be used if the file descriptor refers to a file opened for writing. *len* is the number of bytes to lock, *start* is the byte offset at which the lock starts, relative to *whence*, and *whence* is as with [`io.IOBase.seek()`](io.xhtml#io.IOBase.seek "io.IOBase.seek"), specifically: - `0` -- relative to the start of the file ([`os.SEEK_SET`](os.xhtml#os.SEEK_SET "os.SEEK_SET")) - `1` -- relative to the current buffer position ([`os.SEEK_CUR`](os.xhtml#os.SEEK_CUR "os.SEEK_CUR")) - `2` -- relative to the end of the file ([`os.SEEK_END`](os.xhtml#os.SEEK_END "os.SEEK_END")) The default for *start* is 0, which means to start at the beginning of the file. The default for *len* is 0 which means to lock to the end of the file. The default for *whence* is also 0. Examples (all on a SVR4 compliant system): ``` import struct, fcntl, os f = open(...) rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY) lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0) rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata) ``` Note that in the first example the return value variable *rv* will hold an integer value; in the second example it will hold a [`bytes`](stdtypes.xhtml#bytes "bytes") object. The structure lay-out for the *lockdata* variable is system dependent --- therefore using the [`flock()`](#fcntl.flock "fcntl.flock") call may be better. 参见 模块 [`os`](os.xhtml#module-os "os: Miscellaneous operating system interfaces.")If the locking flags [`O_SHLOCK`](os.xhtml#os.O_SHLOCK "os.O_SHLOCK") and [`O_EXLOCK`](os.xhtml#os.O_EXLOCK "os.O_EXLOCK") are present in the [`os`](os.xhtml#module-os "os: Miscellaneous operating system interfaces.") module (on BSD only), the [`os.open()`](os.xhtml#os.open "os.open")function provides an alternative to the [`lockf()`](#fcntl.lockf "fcntl.lockf") and [`flock()`](#fcntl.flock "fcntl.flock")functions. ### 导航 - [索引](../genindex.xhtml "总目录") - [模块](../py-modindex.xhtml "Python 模块索引") | - [下一页](pipes.xhtml "pipes --- Interface to shell pipelines") | - [上一页](pty.xhtml "pty --- Pseudo-terminal utilities") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) » - zh\_CN 3.7.3 [文档](../index.xhtml) » - [Python 标准库](index.xhtml) » - [Unix 专有服务](unix.xhtml) » - $('.inline-search').show(0); | © [版权所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 软件基金会是一个非盈利组织。 [请捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [发现了问题](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 创建。