3.2.19. ioctl DMX_QBUF, DMX_DQBUF

3.2.19.1. 名称

DMX_QBUF - DMX_DQBUF - 与驱动程序交换缓冲区

警告

此 API 仍然是实验性的

3.2.19.2. 概要

DMX_QBUF

int ioctl(int fd, DMX_QBUF, struct dmx_buffer *argp)

DMX_DQBUF

int ioctl(int fd, DMX_DQBUF, struct dmx_buffer *argp)

3.2.19.3. 参数

fd

open() 返回的文件描述符。

argp

指向 struct dmx_buffer 的指针。

3.2.19.4. 描述

应用程序调用 DMX_QBUF ioctl 将一个空的(捕获)或已填充的(输出)缓冲区排队到驱动程序的传入队列中。语义取决于所选的 I/O 方法。

要将缓冲区排队,应用程序设置 index 字段。有效的索引号范围从零到使用 ioctl DMX_REQBUFS 分配的缓冲区数量(struct dmx_requestbuffers count)减一。由 ioctl DMX_QUERYBUF ioctl 返回的 struct dmx_buffer 的内容也可以。

当使用指向此结构的指针调用 DMX_QBUF 时,它会锁定缓冲区在物理内存中的内存页,因此它们无法交换到磁盘。缓冲区保持锁定状态,直到出队,直到设备关闭。

应用程序调用 DMX_DQBUF ioctl 从驱动程序的传出队列中取出已填充的(捕获)缓冲区。它们只需将 index 字段设置为要排队的缓冲区 ID。当使用指向 struct dmx_buffer 的指针调用 DMX_DQBUF 时,驱动程序会填充剩余的字段或返回错误代码。

默认情况下,当传出队列中没有缓冲区时,DMX_DQBUF 会阻塞。当 O_NONBLOCK 标志被赋予给 open() 函数时,当没有可用的缓冲区时,DMX_DQBUF 会立即返回一个 EAGAIN 错误代码。

struct dmx_buffer 结构在 Buffers 中指定。

3.2.19.5. 返回值

成功时返回 0,出错时返回 -1,并适当地设置 errno 变量。通用错误代码在 通用错误代码 章节中描述。

EAGAIN

已使用 O_NONBLOCK 选择了非阻塞 I/O,并且传出队列中没有缓冲区。

EINVAL

index 超出范围,或者尚未分配任何缓冲区。

EIO

DMX_DQBUF 由于内部错误而失败。也可以指示临时问题,例如信号丢失或 CRC 错误。