【问题标题】:Is accessing a device driver in Linux only possible using its device file?是否只能使用设备文件访问 Linux 中的设备驱动程序?
【发布时间】:2017-10-15 07:41:45
【问题描述】:
假设我有一个网络摄像头,并且我在我的 Linux 操作系统中安装了这个网络摄像头的设备驱动程序,现在将为设备驱动程序创建一个设备文件(例如:/dev/video0)。
现在假设我想在C 中创建一个想要访问此网络摄像头的程序。我的程序如何访问网络摄像头的设备驱动程序,我的程序应该使用设备文件 (/dev/video0) 来访问设备驱动程序,还是有其他方法?
【问题讨论】:
标签:
c
linux
device-driver
【解决方案1】:
您问了一个一般性问题,然后举了一个具体的例子。我会尝试解决这两个问题。
当您加载驱动程序时,从用户空间与其通信的方式是通过该驱动程序定义的任何方式。通常,这是通过为驱动程序创建的/dev 设备。如果是这样的话,是的,这是与它交流的唯一方式。
这并非普遍正确。许多驱动程序在/syssysfs 伪文件系统下也有条目,可以通过那里修改某些方面。事实上,有整类驱动程序只能通过/sys fs 访问。突出的例子是 GPIO 和 Led 设备,它们可以通过访问/sys/class/gpio 和类似路径来打开和关闭。
另一个被认为已弃用但有时仍会使用的选项是使用/proc 伪文件系统。同样,这取决于驱动程序来定义其通信方法。作为用户,您必须遵循驱动程序定义的任何协议。
另外,一些驱动程序根本不存在任何文件系统。最明显的标准示例是网络接口。与它们通信的唯一方法是通过网络系统调用。
在您提供的特定示例中,您谈到了一个显示为/dev/video0 的摄像机。这样的摄像头通常是 Video4Linux(或 v4l)摄像头,可通过其字符设备访问。
话虽如此,与相机通信的协议可能包含使生活更轻松的包装器。如果您打开实际的设备,您可能需要与它进行相当复杂的握手。相反,您可以使用 v4l 库来包装访问的详细信息。
别搞错了。您仍在与/dev 中的字符设备通话。只是不是你的代码做的,而是库的。