/dev/video0 : 无效参数

pra*_*avk 5 webcam kernel device device-driver linux-device-driver

为什么我无法读取此文件。我试着用 cat 读取这个文件:

cat /dev/video0 
Run Code Online (Sandbox Code Playgroud)

但它说

cat: /dev/video0 : invalid arguments
Run Code Online (Sandbox Code Playgroud)

同样,如果我尝试使用 dd 作为:

dd if=/dev/video0 ~/vid
Run Code Online (Sandbox Code Playgroud)

它仍然无法读取它。

请注意,video0 是我的网络摄像头的设备文件。

Mik*_*keW 6

在这种情况下,了解更多信息的一种方法是在strace 中运行命令

strace cat /dev/video0
Run Code Online (Sandbox Code Playgroud)

这将显示故障点的更多详细信息:

....
open("/dev/video0", O_RDONLY)           = 3
fstat(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(81, 0), ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, 0x2379000, 65536)               = -1 EINVAL (Invalid argument)
....
Run Code Online (Sandbox Code Playgroud)

就我而言,这似乎是说我的 /dev/video0 设备不支持所需的操作:所以在这种情况下,“cat”试图从设备读取 64k 字节。

但是,我发现使用 nc (netcat) 而不是 cat 确实可以用于此目的:

nc -l 1234 </dev/video0
Run Code Online (Sandbox Code Playgroud)

带有相应的:

nc 127.0.0.1 1234 | mplayer tv://device=/dev/stdin
Run Code Online (Sandbox Code Playgroud)

本地显示;SSH 隧道端口也可以在这里工作。


小智 1

我认为您在驱动程序中创建的设备节点“video0”的显示函数可能是错误的。

下面举个例子。

static DEVICE_ATTR(video0, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, video0_show, video0_store);

static ssize_t video0_show(struct device *dev, struct device_attribute *attr, char *buf);

static ssize_t video0_store(struct device *dev, struct device_attribute *attr, char *buf, size_t count);
Run Code Online (Sandbox Code Playgroud)

当您在运行时捕获设备节点“video0”时,它会调用“video0_show”函数来打印一些内容。错误消息“cat:/dev/video0:无效参数”表示 video0_show 函数的参数错误。您应该调试驱动程序。