说明

ioctl()系统调用可操纵特殊文件的基础设备参数。特别是,可以使用ioctl()请求来控制字符特殊文件(例如终端)的许多操作特性。参数fd必须是一个打开的文件描述符。

第二个参数是设备相关的请求代码。第三个参数是指向内存的无类型指针。传统上,它是char * argp(从void *为有效C之前的日子开始),因此在此讨论中将其命名。

无论自变量是in参数还是out参数,ioctl()请求都已在其中进行编码,参数argp的大小以字节为单位。用于指定ioctl()请求的宏和定义位于file中。请参阅注释。

错误说明

EBADF
fd不是有效的文件描述符。
EFAULT
argp引用了不可访问的内存区域。
EINVAL
request或argp无效。
ENOTTY
fd与字符特殊设备无关。
ENOTTY
指定的请求不适用于文件描述符fd引用的对象类型。
IOCTL - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-04-11

遵循规范

没有单一标准。 ioctl()的参数,返回值和语义根据所讨论的设备驱动程序而有所不同(该调用用作不完全适合UNIX流I / O模型的操作的全部内容)。

ioctl()系统调用出现在版本7 AT&T UNIX中。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

名称

ioctl-控制设备

语法

#包括

int ioctl(int fd,无符号长请求,...);

返回值

通常,成功返回零。一些ioctl()请求使用返回值作为输出参数,并在成功时返回非负值。如果出错,则返回-1,并正确设置errno。

另外参见

execve(2),fcntl(2),ioctl_console(2),ioctl_fat(2),ioctl_ficlonerange(2),ioctl_fideduperange(2),ioctl_fslabel(2),ioctl_getfsmap(2),ioctl_iflags(2),ioctl_ns ioctl_tty(2),ioctl_userfaultfd(2),open(2),sd(4),tty(4)

备注

为了使用此调用,需要一个打开的文件描述符。通常,open(2)调用会产生有害的副作用,在Linux下,可以通过为其赋予O_NONBLOCK标志来避免这种副作用。

ioctl structure

Ioctl命令值是32位常量。原则上,这些常数是完全任意的,但是人们试图在其中建立一些结构。

旧的Linux环境是大多数16位常量,最后一个字节是序列号,而前面的字节给出了指示驱动程序的类型。有时使用的主要数字是:HDIO_ * ioctls为0x03,LP * ioctls为0x06。有时使用一个或多个ASCII字母。例如,TCGETS的值为0x00005401,0x54 = aqTaq表示终端驱动程序,而CYGETTIMEOUT的值为0x00435906,0x43 0x59 = aqCaq aqYaq表示基元驱动程序。

稍后(0.98p5),数字中内置了更多信息。一个具有2个方向位(00:无,01:写,10:读,11:读/写),其后是14个大小位(给定参数的大小),然后是8位类型(将ioctl收集在通用组或通用驱动程序组)和一个8位序列号。

描述此结构的宏位于_IO(type,nr)和{_IOR,_IOW,_IOWR}(type,nr,size)中。他们使用sizeof(size),因此size在这里是错误的:第三个参数是数据类型。

请注意,大小位非常不可靠:在很多情况下,它们是错误的,这可能是因为使用sizeof(sizeof(struct))的错误的宏,或者是由于遗留了值。

因此,新结构似乎只具有缺点:它无助于检查,但会导致各种体系结构的值发生变化。

日期:2019-08-20 17:58:53 来源:oir作者:oir