Linux的ioctl和fcntl
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.
- 复制文件描述符,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。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13545.html