• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard-文件I/O的了解探究之fcntl和ioctl

11/28 13:32
81
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

fcntl

用于对一个已经打开的文件描述符执行一系列控制操作,比如复制一个文件描述符(与 dup、dup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等。

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(获取文件状态标志)将返回文件状态标志等。

ioctl

用于操作特殊文件或硬件外设,需结合内核驱动,目前不需深入了解。

1.头文件

#include <sys/ioctl.h>

2.函数原型

int ioctl(int fd, unsigned long request, ...);

3.参数

fd:表示要操作文件的文件描述符。

request:此参数与具体要操作的对象有关,没有统一值。

4.返回值

若函数调用成功返回 0,失败返回-1。

相关推荐