Linux的ioctl和fcntl

Linux的ioctl和fcntl


1. 一切都是文件

在Linux中一切设备都当作文件,也就是说一切设备都抽象成一个文件,能够提取出来一些共同的特征。文件的一些最常用的操作,如打开、读取、写入等,Linux都提供了单独的系统调用(open、read、write)供程序使用。

2. fcntl

NAME
    fcntl - manipulate file descriptor

SYNOPSIS
       #include
       #include

       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 device

SYNOPSIS
     #include
     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,c)