我目前正在研究如何从python中使用v4l2设备,并发现python对ioctl (https://docs.python.org/3/library/fcntl.html)有一个绑定。
我用C进行了一些实现,但我很难理解ioctl是否与v4l2_ioctl相同?
它们似乎采用了完全相同的论点,在我看到的官方示例中,这两种参数都封装在一个函数中,使用的方式是相同的:
static void xioctl(int fh, int request, void *arg)
{
int r;
do {
r = v4l2_ioctl(fh, request, arg);
} while (r == -1 && ((errno == EINTR) || (errno == EAGAIN)));
if (r == -1) {
fprintf(stderr, "error %d, %s\\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
}对于正常的ioctl:
static int xioctl(int fh, int request, void *arg)
{
int r;
do {
r = ioctl(fh, request, arg);
} while (-1 == r && EINTR == errno);
return r;
}我查看了linux存储库,但找不出两者之间的确切区别。
我可以交替使用ioctl和v4l2_ioctl吗?
如果是这样的话,为什么两者都存在?
如果不是,与v4l2_ioctl相比,ioctl的局限性是什么?
发布于 2021-04-20 11:48:14
我可以交替使用ioctl和v4l2_ioctl吗?
不是的。
如果是这样的话,为什么两者都存在?
ioctl的存在是为了在设备上执行一些特殊的操作。
v4l2_ioctl是libv4l2的包装器,用于简化v4l2设备上的操作。
来自自述文件
libv4l2 它提供了诸如v4l2_open、v4l2_ioctl等功能,这些功能可以使v4l2应用程序快速地与具有怪异格式的v4l2设备一起工作。libv4l2主要将调用直接传递给v4l2驱动程序。当应用程序执行不受支持的格式的TRY_FMT / S_FMT时,libv4l2将进入中间并模拟格式(如果应用程序想知道硬件真正可以实现哪种格式,则应该使用ENUM_FMT,而不是随机地尝试一堆S_FMT)。有关v4l2_函数的更多细节,请参见libv4l2.h。
在libv4l项目中找到的源是最终的代码文档。
https://stackoverflow.com/questions/67176256
复制相似问题