【问题标题】:Where can I find the definition for a system call parameter?在哪里可以找到系统调用参数的定义?
【发布时间】:2016-04-19 18:51:27
【问题描述】:

在 ioctl 手册页中定义:

int ioctl(int d,int request,...); 

例如:

ioctl(fd,FIONREAD,&nread);     

在 Linux 中哪里可以找到这个 FIONREAD 信息?这些信息在哪里定义?这样的种类有多少?

【问题讨论】:

  • man ioctl -> #include <sys/ioctl.h> -> /usr/include/bits/ioctls.h -> /usr/include/asm/ioctls.h -> asm-generic/ioctls.h - > #define FIONREAD 0x541B

标签: linux system-calls ioctl


【解决方案1】:

一般来说,系统调用的手册页 (man 2 ioctl — section 2 is for system calls) 是正确的位置。

ioctl 是一种特殊情况,因为此系统调用的目的是允许应用程序向不适合一般模式的设备发送命令。所以很多时候参数的文档不在ioctl的文档中,而是在设备驱动的文档中。设备的手册页位于第 4 节(或某些 Unix 变体的第 7 节)。

在 Linux 上,ioctl(2) 手册页引用了 ioctl_list(2),其中包含常见 ioctl 类型的摘要。在设备手册页中有更多关于一些 ioctl 的文档,例如 tty_ioctl(4)(终端 — 这就是 FIONREAD 的用途)和 sd(4)(具有类似 SCSI 接口的磁盘)。更多 ioctl 记录在 kernel documentation 中,例如 CD drives。对于很多驱动,Linux 缺少文档,需要参考内核源代码或头文件(在/usr/include 下搜索,希望能找到 cmets)。

【讨论】:

    【解决方案2】:

    根据经验,只要你有一个全部大写的标识符,至少在 c 语言中,它通常在某个头文件中定义。它可以是一个类型、一个枚举,也可以是一个明确定义的符号。大多数情况下,查看头文件仅有助于了解您必须从中选择哪些其他可能的选项。使用 find 和 grep 通常会定位文件(linux 示例):

    cd /usr/include; find . -type f -name \*.h -print0 | xargs -0 grep <name>
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 2014-01-22
      • 2019-05-07
      相关资源
      最近更新 更多