Linux的ioctl和fcntl
来源:互联网 发布:网络问诊国家政策 编辑:程序博客网 时间:2024/06/10 18:03
【转自】http://blog.csdn.net/liuxingen/article/details/46898495
1. 一切都是文件
在Linux中一切设备都当作文件,也就是说一切设备都抽象成一个文件,能够提取出来一些共同的特征。文件的一些最常用的操作,如打开、读取、写入等,Linux都提供了单独的系统调用(open、read、write)供程序使用。
2. fcntl
NAME
fcntl - manipulate file descriptorSYNOPSIS
#include <unistd.h>
#include <fcntl.h>int fcntl(int fd, int cmd, … /* arg */ );
DESCRIPTION
fcntl() performs one of the operations described below on the open file descriptor fd. The operation is determined by cmd.
从上面fcntl的man手册来看,fcntl就是对打开的文件描述符进行一系列的控制操作。每一个打开的文件有很多的属性,比如文件描述符的标志(目前只有FD_CLOEXEC一个标志)、文件的状态(O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC)。
fcntl主要有如下几个方面的功能:
- 复制文件描述符,cmd:F_DUPFD、F_DUPFD_CLOEXEC
- 文件描述符标志位,cmd:F_GETFD、F_SETFD
- 文件状态标志,cmd:F_GETFL、F_SETFL
- 文件建议锁,cmd:F_SETLK, F_SETLKW, and F_GETLK
上面提到的fcntl的功能大部分都是对文件描述符的一些通用属性进行操作,因为这些功能相对read、write等常用的功能不那么常用所以把这些功能都放到一个“收纳盒“fcntl中。
3. ioctl
NAME
ioctl - control deviceSYNOPSIS
#include <sys/ioctl.h>
int ioctl(int d, unsigned long request, …);DESCRIPTION
The ioctl() function manipulates the underlying device parameters of special files.
ioctl就是对设备(文件)的控制操作。上面我们知道一切设备都可以看做是文件,我们已经提到了一些对文件(设备)的通用操作,每一个设备肯定有一些不同于其它设备的功能或者属性,比如网络接口设备有IP、mask等属性,终端设备有波特率。
那么对设备的不同属性我们也提供了另外一个“收纳盒“ioctl,因为每一个设备的特性都是不同的所以不可能有一个统一的request,而且我们也不可能在kernel层面提供ioctl的具体实现,而是由每一个设备的驱动程序提供设备支持的ioctl操作集合。
在fcntl的man手册中列出了支持的所有cmd,但是在ioctl的man手册中没有列出支持的request,这是因为ioctl是每一个设备自身的实现来支持的。系统本身对一些常见的设备提供了一些ioctl支持,如网络设备的SIOCGIFNAME获取网口的名称等,除了这些常见的设备以外其它的设备的ioctl支持都需要自己在驱动中支持。
4. 总结
文件(设备)的常用操作提供了常用的read、write函数,不太常用的属性操作提供了fcntl,单独的控制功能提供了ioctl。
- Linux的ioctl和fcntl
- Linux的ioctl和fcntl
- Linux文件I/O的lseek,fcntl和ioctl函数
- Linux下开发-fcntl和ioctl的区别
- ioctl 和fcntl
- fcntl 和 ioctl
- unix/linux编程实践教程------fcntl和ioctl
- 系统调用fcntl 和 ioctl
- linux下文件操作API:write/read/fcntl/ioctl/mmap
- fcntl, ioctl, tcgetattr
- fcntl文件属性和ioctl文件输入输出控制函数详解
- ioctl() fcntl() setsockopt() ioctlsocket() 用法
- linux 的ioctl
- linux 的ioctl()函数
- linux 下fcntl的使用
- linux 下fcntl的使用
- linux 下fcntl的使用
- linux下的fcntl()函数
- freemarker中使用shiro标签
- tensorflow实战系列(四)基于TensorFlow构建AlexNet代码解析
- 关于Xfermode中src和dsc的问题
- Java 获取前端页面代码段中img标签的src属性值,即获取图片Url
- 关于TabLayout遇到的坑
- Linux的ioctl和fcntl
- BZOJ4811 [Ynoi2017]由乃的OJ
- 按选择的开始时间和结束时间算出中间的所有年月日
- left join on 和where条件的放置 区别
- laravel接值 get post
- 算法分析与设计课程(7):【leetcode】Reverse Nodes in k-Group
- CSS 筛选器详解
- 内生性的变革,还是外延式的扩张
- maven_项目的依赖、聚合、继承