IOCTL - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-04-11
名称
ioctl-控制设备
语法
#包括
int ioctl(int fd,无符号长请求,...);
说明
ioctl()系统调用可操纵特殊文件的基础设备参数。特别是,可以使用ioctl()请求来控制字符特殊文件(例如终端)的许多操作特性。参数fd必须是一个打开的文件描述符。
第二个参数是设备相关的请求代码。第三个参数是指向内存的无类型指针。传统上,它是char * argp(从void *为有效C之前的日子开始),因此在此讨论中将其命名。
无论自变量是in参数还是out参数,ioctl()请求都已在其中进行编码,参数argp的大小以字节为单位。用于指定ioctl()请求的宏和定义位于file中。请参阅注释。
返回值
通常,成功返回零。一些ioctl()请求使用返回值作为输出参数,并在成功时返回非负值。如果出错,则返回-1,并正确设置errno。
错误说明
- EBADF
- fd不是有效的文件描述符。
- EFAULT
- argp引用了不可访问的内存区域。
- EINVAL
- request或argp无效。
- ENOTTY
- fd与字符特殊设备无关。
- ENOTTY
- 指定的请求不适用于文件描述符fd引用的对象类型。
遵循规范
没有单一标准。 ioctl()的参数,返回值和语义根据所讨论的设备驱动程序而有所不同(该调用用作不完全适合UNIX流I / O模型的操作的全部内容)。
ioctl()系统调用出现在版本7 AT&T UNIX中。
备注
为了使用此调用,需要一个打开的文件描述符。通常,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))的错误的宏,或者是由于遗留了值。
因此,新结构似乎只具有缺点:它无助于检查,但会导致各种体系结构的值发生变化。
另外参见
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)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。