在学习Linux设备驱动和视频开发的时候,对于这个函数又去了解了一下,因为之前觉得似懂非懂,所以这里来个总结吧,下面的都是在v4l2上面来讲解一下
1.ioctl 是什么?
可以把 ioctl
(Input/Output Control)想象成一个万能遥控器。就像平时用遥控器控制电视(换台、调音量、设置画质),ioctl
就是用来控制各种硬件设备的“遥控器”
2.为什么需要它?
- 普通的
read()
和write()
只能做简单的读写(像用键盘打字) - 但硬件设备有很多复杂操作:比如设置摄像头分辨率、调整麦克风音量、让打印机换纸...
- 这些特殊操作,全都可以交给
ioctl
来搞定
3.函数原型
int ioctl(int fd, unsigned long request, ...);
fd
:文件描述符(就是你用open()
打开设备后得到的那个“门票”)request
:你要发送的“指令代码”(比如:调大音量、获取分辨率)...
:附加参数(通常是个结构体指针,用来传递/接收数据)
这里也要解释一下:
误区:认为“结构体里必须包含命令字段”
真相:结构体只是用来传递数据,真正决定操作的是 request
参数。结构体的内容必须与 request
匹配
4.举个栗子 🌰:控制摄像头
假设你有一个摄像头设备 /dev/video0
:
-
打开设备:
int fd = open("/dev/video0", O_RDWR); // 拿到“门票”fd
-
设置视频格式:
struct v4l2_format fmt = {0}; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = 640; fmt.fmt.pix.height = 480; // 发送指令:告诉摄像头 我要设置格式为640x480 ioctl(fd, VIDIOC_S_FMT, &fmt);
VIDIOC_S_FMT
是预设的指令代码(表示“设置格式”)&fmt
是传递的参数(具体要设置什么