ioctl函数讲解

在学习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

  1. 打开设备

    int fd = open("/dev/video0", O_RDWR); // 拿到“门票”fd
  2. 设置视频格式

    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 是传递的参数(具体要设置什么
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值