• linux ioctl 系统调用预定义的命令


    尽管 ioctl 系统调用最常用来作用于设备, 内核能识别几个命令. 注意这些命令, 当用 到你的设备时, 在你自己的文件操作被调用之前被解码. 因此, 如果你选择相同的号给一 个你的 ioctl 命令, 你不会看到任何的给那个命令的请求, 并且应用程序获得某些不期望 的东西, 因为在 ioctl 号之间的冲突.

    预定义命令分为 3 类:

    • 可对任何文件发出的(常规, 设备, FIFO, 或者 socket) 的那些.
    • 只对常规文件发出的那些.
    • 对文件系统类型特殊的那些.

    最后一类的命令由宿主文件系统的实现来执行(这是 chattr 命令如何工作的). 设备驱动 编写者只对第一类命令感兴趣, 它们的魔数是 "T". 查看其他类的工作留给读者作为练习; ext2_ioctl 是最有趣的函数(并且比预期的要容易理解), 因为它实现 append-only 标志 和 immutable 标志.

    下列 ioctl 命令是预定义给任何文件, 包括设备特殊的文件: FIOCLEX

    设置 close-on-exec 标志(File IOctl Close on EXec). 设置这个标志使文件描 述符被关闭, 当调用进程执行一个新程序时.

    FIONCLEX

    清除 close-no-exec 标志(File IOctl Not CLose on EXec). 这个命令恢复普通 文件行为, 复原上面 FIOCLEX 所做的. FIOASYNC 为这个文件设置或者复位异步通 知(如同在本章中"异步通知"一节中讨论的). 注意直到 Linux 2.2.4 版本的内核 不正确地使用这个命令来修改 O_SYNC 标志. 因为两个动作都可通过 fcntl 来完 成, 没有人真正使用 FIOASYNC 命令, 它在这里出现只是为了完整性.

    FIOQSIZE

    这个命令返回一个文件或者目录的大小; 当用作一个设备文件, 但是, 它返回一个 ENOTTY 错误.

    FIONBIO

    "File IOctl Non-Blocking I/O"(在"阻塞和非阻塞操作"一节中描述). 这个调用 修改在 filp->f_flags 中的 O_NONBLOCK 标志. 给这个系统调用的第 3 个参数用 作指示是否这个标志被置位或者清除. (我们将在本章看到这个标志的角色). 注意 常用的改变这个标志的方法是使用 fcntl 系统调用, 使用 F_SETFL 命令.

    列表中的最后一项介绍了一个新的系统调用, fcntl, 它看来象 ioctl. 事实上, fcntl 调用非常类似 ioctl, 它也是获得一个命令参数和一个额外的(可选地)参数. 它保持和 ioctl 独立主要是因为历史原因: 当 Unix 开发者面对控制 I/O 操作的问题时, 他们决 定文件和设备是不同的. 那时, 有 ioctl 实现的唯一设备是 ttys, 它解释了为什么 - ENOTTY 是标准的对不正确 ioctl 命令的回答. 事情已经改变, 但是 fcntl 保留为一个 独立的系统调用.

  • 相关阅读:
    python虚拟环境使用
    虚拟化网络进阶管理
    虚拟化进阶管理
    KVM虚拟化
    Xen虚拟化
    Virtualization基础
    Virnish使用
    CentOS配置FTP服务器
    Ajax结合Json进行交互数据(四)
    将 数据库中的结果集转换为json格式(三)
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11141811.html
Copyright © 2020-2023  润新知