在哪里可以找到系统调用参数的定义?

Posted

技术标签:

【中文标题】在哪里可以找到系统调用参数的定义?【英文标题】: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 【参考方案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>

【讨论】:

以上是关于在哪里可以找到系统调用参数的定义?的主要内容,如果未能解决你的问题,请参考以下文章

LINUX系统调用

操作系统在哪里存储命令行参数?

将零参数作为参数传递——行为是在哪里定义的?

php如何调用函数

linux系统中cadence 的显示文件在哪里?怎么调用,其默认安装路径在哪里??

linux系统调用包含啥头文件