我的编程空间,编程开发者的网络收藏夹
学习永远不晚

linux设备节点的概念是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

linux设备节点的概念是什么

这篇文章主要介绍了linux设备节点的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux设备节点的概念是什么文章都会有所收获,下面我们一起来看看吧。

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

本教程操作环境:linux5.9.8系统、Dell G3电脑。

什么是设备节点

人和人之间沟通桥梁是语言。同样,应用程序和设备驱动程序沟通也需要一个桥梁。这个桥梁就是设备节点。

对于Linux系统,所有的IO资源都是文件,包括文件、目录、硬盘、设备等。那么,键盘作为计算机系统中的一款输入设备,操作系统同样也把它抽象了文件,要想获取用户从键盘上输入的数据时,只需要读取键盘提供的设备节点即可。

在Linux系统中,键盘作为输入设备,其对应的设备节点位于”/dev/input“下。在这个文件夹下有很多以event打头的文件,这些就是所有input设备的设备节点。如何确定哪个是键盘的设备节点呢?将键盘连接到树莓派上,打开终端,执行“sudo cat /dev/input/event0”,敲击键盘,如果没有输出,就换下一个节点,直到找到有输出的节点,那这个节点就是键盘对应的设备节点。

设备节点被创建在/dev下,是连接内核与用户层的枢纽,就是设备是接到对应哪种接口的哪个ID 上。 相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息

在Linux中,所有设备都以文件的形式存放在/dev目录下,都是通过文件的方式进行访问,设备节点是Linux内核对设备的抽象,一个设备节点就是一个文件。应用程序通过一组标准化的调用执行访问设备,这些调用独立于任何特定的驱动程序。而驱动程序负责将这些标准调用映射到实际硬件的特有操作。

设备节点的作用

设备节点使得用户可以与内核进行硬件的沟通,读写设备以及其他的操作

在linux里面设备就像是普通文件一样的存在,访问一个设备就好像是访问一个文件一样

主设备号代表着一类设备,次设备号代表着同一类设备的不同个体,说到这里也许并不知道设备节点的存在形式

设备节点的存在形式

另外在linux里面还有一个概念,就是inode与block,也就是硬盘一面的块与节点,硬盘里面的inode就相当于一个文件或者文件夹,它记录下此文件下面的文件位置所在,文件的位置是以block大小对齐的,例如有些系统就是4K的大小,而inode的大小是有限的,所以就有了单个文件不能超过4G的说法。而在linux的驱动程序里面的节点在我个人的理解也可以看做是一个类似于硬盘的inode一样的东西,里面可以记录硬件设备的位置以及别的一些信息,在用户需要进行访问的时候就参照到设备节点所记录的信息进行设备的访问

如何从设备节点中获取数据

操作系统之所以把IO都抽象成了文件,最大的好处就是可以通过统一的接口来访问这个文件,从而和不同的设备沟通。这些统一的接口就是操作系统针对文件操作对外提供的一组系统调用:open函数、read函数、write函数等。比如,如果需要从一个设备中获取数据,只需要调用read函数去读取该设备对应的设备节点就可以了,当然在read之前,要先调用open函数打开。现在以获取键盘输入为例来介绍。

打开设备节点

在读取设备节点的数据之前,要先调用open函数打开设备节点。open函数的具体用法可以参考链接。简单描述如下:

函数声明:

int open(const char *pathname, int flags);

需要包含的头文件:

  #include <fcntl.h>

参数:

* 第一个参数(const char *pathname):表示需要打开的文件路径

* 第二个参数(int flags):表示打开文件的方式,比如,”O_RDONLY” ——只读打开;”O_WRONLY”——只写打开;”O_RDWR”——读、写打开,等。

返回值:

 如果打开成功,则返回该文件的文件描述符,以供read,write等函数使用。否则,返回-1。

那么,要打开键盘的设备文件(假设是”/dev/input/even10“),则需要以下代码:

  int keys_fd;    keys_fd = open("/dev/input/even10", O_RDONLY);    if(keys_fd <= 0)    {        printf("open /dev/input/event10 device error!\n");        return -1;    }

2 、读取设备节点的数据

读取设备节点需要使用read函数,具体使用方法可以参考链接。简单介绍如下:

函数声明:

  ssize_t read(int fd, void *buf, size_t count);

需要包含的头文件:

  #include <unistd.h>

参数:

* 第一个参数(int fd):要打开文件的文件描述符,来源一般是上述open函数的返回值。

* 第二个参数(void *buf):读取到的数据存放的起始位置指针

* 第三个参数(size_t count):要读取的数据字节数

返回值:

* 如果读取成功,则返回实际读取到的字节数

* 如果读取失败,则返回-1

* 如果返回值小于第三个参数count,则表示已经读取到文件结尾,返回值表示实际读取的字节数。

在读取键盘的例子中,我们循环读取键盘设备的文件节点,并将设备保存到一个char buf[24]的数组中去。具体代码如下:

char buf[24];while(1){    if(read(keys_fd, buf, 24) == 24)    {        // 成功的从设备节点中获取到了24个字节        ...    }}

根据read函数用法,当要读取24个字节,且read函数的返回值是24时,表示成功的从设备节点中获取到了24个字节。

分析从设备节点获取的数据

为什么这里要从键盘的设备驱动获取24个字节呢?这是因为正常情况下,从键盘设备节点获取的数据实际上是一个struct input_event结构。其定义为:

struct input_event {    struct timeval time;    __u16 type;    __u16 code;    __s32 value;};

显然,上述结构体的大小为24。

  这里需要理解的是:设备节点是设备驱动程序提供的,且设备节点的数据是设备驱动写入的,而且写入时,是以上述结构的规则写入的,这是双方通过<linux/input.h>约定好的,那么应用程序去设备节点中读取数据之后,也需要按照上述结构去解析数据。那这个结构具体是什么意思呢?

* struct timeval time:其大小为16个字节,具体意义暂时不考虑。

* __u16 type:其大小为2个字节,表示input设备的类型,比如:EV_KEY表示上报的是键盘类型的数据,EV_REL表示相对路径,鼠标就属于这种类型,还是其他等等。

* __u16 code:其大小为2个字节,表示事件的代码。比如,如果type为EV_KEY,那么该代码code为设备键盘代码。code值实际上是应用程序和驱动程序约定好的一些固定的值,它可取的值位于include/uapi/linux/input-event-codes.h中。举例来讲,根据Linux源码下的include/uapi/linux/input-event-codes.h文件的第91行#define KEY_Q 16,如果键盘上按下或松开了Q键,那么键盘的驱动程序上报的code值应该是16;反之,如果应用程序获取到的值是19,那么,表示用户按下或松开了键盘上的Q键。

* __s32 value:其大小为4个字节,事件的值。如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;

根据上述解释,我们可以添加以下代码来解析从设备节点中获取的数据。

if(t.type == EV_KEY)                // 我们只关心input event类型为EV_KEY(按键)的消息    if(t.value == 0 || t.value == 1)    {        printf("key %d %s\n",         t.code,                     // t.code表示按下或松开了哪个按键        (t.value) ? "Pressed" : "Released");   // t.value表示按下还是松开了相应的按键    }

关闭设备节点

在从设备节点获取数据完成后,务必调用close函数,来关闭设备节点。即

close(keys_fd);

关于“linux设备节点的概念是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“linux设备节点的概念是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

linux设备节点的概念是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux设备节点的概念是什么

这篇文章主要介绍了linux设备节点的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux设备节点的概念是什么文章都会有所收获,下面我们一起来看看吧。linux设备节点是应用程序和设备驱动程序沟通
2023-06-30

linux localhost的概念是什么

本篇内容介绍了“linux localhost的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!lin
2023-03-14

linux mono的概念是什么

这篇“linux mono的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux mono的概念是什么”文章吧
2023-03-09

linux mtd的概念是什么

本篇内容主要讲解“linux mtd的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux mtd的概念是什么”吧!在linux中,mtd是指“内存技术设备”,是存储设备中的一个子
2023-06-30

linux lun的概念是什么

这篇文章主要讲解了“linux lun的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux lun的概念是什么”吧!linux lun是指逻辑单元号,其英文全称是“Logic
2023-07-05

linux mint的概念是什么

这篇文章主要介绍“linux mint的概念是什么”,在日常操作中,相信很多人在linux mint的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux mint的概念是什么”的疑惑有所帮助!
2023-07-02

linux xorg的概念是什么

这篇文章主要介绍“linux xorg的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux xorg的概念是什么”文章能帮助大家解决问题。linux x
2023-03-19

linux eq的概念是什么

本篇内容介绍了“linux eq的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!linux eq的意
2023-03-23

linux ha的概念是什么

这篇文章主要介绍“linux ha的概念是什么”,在日常操作中,相信很多人在linux ha的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux ha的概念是什么”的疑惑有所帮助!接下来,请跟
2023-03-23

linux nginx的概念是什么

今天小编给大家分享一下linux nginx的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。linux nginx
2023-07-05

linux容器的概念是什么

这篇文章主要讲解了“linux容器的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux容器的概念是什么”吧!linux容器是与系统其他部分隔离开
2023-03-19

linux中proc的概念是什么

今天小编给大家分享一下linux中proc的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,proc
2023-06-29

linux中e2fsck的概念是什么

这篇文章主要介绍了linux中e2fsck的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux中e2fsck的概念是什么文章都会有所收获,下面我们一起来看看吧。在linux中,e2fsck是一个
2023-07-04

linux中mount的概念是什么

今天小编给大家分享一下linux中mount的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,mou
2023-06-30

linux中du的概念是什么

这篇文章主要介绍了linux中du的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux中du的概念是什么文章都会有所收获,下面我们一起来看看吧。linux中,du全称“Disk Usage”,是
2023-06-30

linux中rss的概念是什么

本文小编为大家详细介绍“linux中rss的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中rss的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。linux中,rss全称“Resi
2023-06-30

linux中version的概念是什么

这篇“linux中version的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux中version的概念是
2023-06-29

linux中ls的概念是什么

这篇文章主要介绍了linux中ls的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux中ls的概念是什么文章都会有所收获,下面我们一起来看看吧。linux中ls是“list files”的缩写,
2023-06-29

linux中uuid的概念是什么

这篇文章主要讲解了“linux中uuid的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中uuid的概念是什么”吧!在linux中,uuid是通用唯一识别码。uuid是一
2023-06-29

linux句柄的概念是什么

本篇内容主要讲解“linux句柄的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux句柄的概念是什么”吧!在linux中,句柄是一个标识符,是由系统所管理的引用标识,内核可以通过
2023-06-29

编程热搜

目录