用于对一个已经打开的文件描述符执行一系列控制操作,比如复制一个文件描述符(与 dupdup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等
1.头文件
#include <unistd.h>
#include <fcntl.h>
2.函数原型
int fcntl(int fd, int cmd, ...)
3.参数
fd:表示要操作文件的文件描述符。
cmd:操作命令。cmd 操作命令大致可以分为以下 5 种功能:
复制文件描述符(cmd=F_DUPFD cmd=F_DUPFD_CLOEXEC);
获取/设置文件描述符标志(cmd=F_GETFD cmd=F_SETFD);
获取/设置文件状态标志(cmd=F_GETFL cmd=F_SETFL);
获取/设置异步 IO 所有权(cmd=F_GETOWN cmd=F_SETOWN);
获取/设置记录锁(cmd=F_GETLK cmd=F_SETLK);
…:表示附加可变参数,需要根据不同的cmd来传入对应的实参,配合cmd来使用。
cmd
含义
第三个参数类型
成功时返回值
F_DUPFD
复制文件描述符
int
复制的新文件描述符
F_GETFD
获取文件描述符标志
文件描述符标志位(整数)
F_SETFD
设置文件描述符标志
int
0成功-1失败
F_GETFL
获取文件状态标志
文件状态标志位(整数)
F_SETFL
设置文件状态标志
int
0成功-1失败
F_GETLK
获取记录锁
struct flock *
0无冲突-1失败
F_SETLK
设置记录锁
const struct flock *
0成功-1失败
F_SETLKW
设置记录锁(阻塞版本)
const struct flock *
0成功-1失败
F_GETOWN
获取异步I/O所有权
所有权的进程ID(整数)
F_SETOWN
设置异步I/O所有权
pid_t
0成功-1失败
F_GETLK64
获取记录锁(64位版本)
struct flock64 *
0成功-1失败
F_SETLK64
设置记录锁(64位版本)
const struct flock64 *
0成功-1失败
F_SETLKW64
设置记录锁(阻塞版本,64位版本)
const struct flock64 *
0成功-1失败
F_GETSIG
获取信号
信号值(整数)
F_SETSIG
设置信号
int
0成功-1失败
F_GETLEASE
获取文件租约状态
租约状态
F_SETLEASE
设置文件租约
int
0成功-1失败
F_NOTIFY
监视文件状态变化
int
0成功-1失败
F_GETPIPE_SZ
获取管道容量
管道容量 (整数)
F_SETPIPE_SZ
设置管道容量
int
0成功-1失败
F_GET_SEALS
获取文件封印状态
文件封印状态(整数)
F_ADD_SEALS
添加文件封印
unsigned int
0成功-1失败
F_GET_RW_HINT
获取读写优化提示
读写优化提示(整数)
F_SET_RW_HINT
设置读写优化提示
unsigned int
0成功-1失败
F_GET_FILE_RW_HINT
获取文件读写优化提示
读写优化提示(整数)
F_SET_FILE_RW_HINT
设置文件读写优化提示
unsigned int
0成功-1失败
F_GETLKPID
获取记录锁并返回占有者的进程ID
struct flock *
整数占有者的进程ID
-1失败
F_OFD_GETLK
获取OFD记录锁
struct flock *
0无冲突-1失败
F_OFD_SETLK
设置OFD记录锁
const struct flock *
0成功-1失败
F_OFD_SETLKW
设置OFD记录锁(阻塞版本)
const struct flock *
0成功-1失败
4.返回值
执行失败情况下,返回-1,并且会设置errno;执行成功的情况下,其返回值与cmd(操作命令)有关,譬如cmd=F_DUPFD(复制文件描述符)将返回一个新的文件描述符、cmd=F_GETFD(获取文件描述符标志)将返回文件描述符标志、cmd=F_GETFL(获取文件状态标志)将返回文件状态标志等
1.3.9.2 ioctl
用于操作特殊文件或硬件外设,需结合内核驱动,目前不需深入了解。
1.头文件
#include <sys/ioctl.h>
2.函数原型
int ioctl(int fd, unsigned long request, ...);
3.参数
fd:表示要操作文件的文件描述符。
request:此参数与具体要操作的对象有关,没有统一值
4.返回值
若函数调用成功返回 0,失败返回-1

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.5  © 2001-2013 Comsenz Inc.