【玩转Linux】Linux输入子系统简介

news2024/12/23 22:35:12
  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

        Linux输入子系统是内核中的一个重要组成部分,负责处理和管理输入设备的驱动和事件。它允许用户空间应用程序与输入设备进行交互,从而实现用户与计算机之间的交互和控制。

 

一、设备驱动

        输入子系统提供了与输入设备通信的驱动程序。这些驱动程序负责与硬件设备进行交互,接收输入事件,并将其传递给输入子系统处理。例如,当用户按下键盘上的一个按键,键盘的硬件驱动程序会生成一个表示该按键事件的数据,然后将其传递给输入子系统。

struct input_dev *input_dev;
input_dev = input_allocate_device();
// set up input_dev details
input_dev->name = "my_input";
input_dev->id.bustype = BUS_HOST;
// register input device
if (input_register_device(input_dev))
    printk(KERN_ERR "Failed to register input device\n");

        上述代码示例中,首先分配了一个输入设备的内存空间,然后设置输入设备的相关属性,如设备名和设备类型。最后,用input_register_device()函数将设备注册到输入子系统。

二、输入事件处理

        输入子系统接收来自驱动程序的输入事件,这些事件可以是按键、鼠标移动、点击、触摸等。输入子系统将这些事件进行解析和处理,转换为通用的输入事件数据格式供用户空间应用程序使用。

// read input event
struct input_event ev;
int fd = open("/dev/input/event0", O_RDONLY);
read(fd, &ev, sizeof(struct input_event));
printf("Event: time %ld.%06ld, type %d , code %d , value %d\n", 
        ev.time.tv_sec, ev.time.tv_usec, ev.type, ev.code, ev.value);
close(fd);

        上述代码示例中,首先打开输入设备文件,然后读取输入事件。最后,输出输入事件的时间、类型、代码和值。

三、输入设备文件

        在Linux系统中,每个输入设备都会映射为一个特定的文件,通常位于/dev/input目录下。用户空间应用程序可以通过读取这些文件来获取输入事件。

ls /dev/input

        你可以通过运行上述命令列出你的Linux系统中的所有输入设备文件。

        其中 event0代表触摸屏,其余的暂时用不到,如果你想打开触摸屏,那么下面是一个示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

#define TOUCH_DEV	"/dev/input/event0"

int main(int argc, char *argv[])
{
	// 1. 打开触摸屏设备
	int touch_fd = open(TOUCH_DEV, O_RDONLY);
	if (touch_fd < 0)
	{
		perror("open touch fail");
		exit(errno);
	}

	// 2. 读取输入设备产生的信息
	struct input_event ev;	// 定义输入事件结构体变量
	int x = 0, y = 0;

	while (1)
	{
		read(touch_fd, &ev, sizeof(ev));	// 读取输入事件产生的信息,存储到ev结构体中

		if (ev.type == EV_ABS)	// 判定是否是绝对事件
		{
			if (ev.code == ABS_X)	// X轴事件
				x = ev.value * 800 / 1024;	// 事件的值,转换为屏幕坐标
			if (ev.code == ABS_Y)	// Y轴事件
				y = ev.value * 480 / 600;	// 事件的值,转换为屏幕坐标
		}
		else if (ev.type == EV_KEY && ev.code == BTN_TOUCH)	// 是否是一个键盘事件,BTN_TOUCH表示按压,按下动作
		{
			if (ev.value == 0)	// 默认为0,如果非0,说明屏幕有按下的操作
				printf("松开\n");
			else
				printf("按下\n");
		}

		printf("(%d, %d)\n", x, y);	// 打印触摸屏坐标

		if (x > 400)
			printf("屏幕右半边\n");
		else
			printf("屏幕左半边\n");
	}

	// 关闭触摸屏设备文件
	close(touch_fd);

	return 0;
}

四、应用程序接口

        输入子系统提供了一组API供用户空间应用程序使用,使得应用程序可以监听输入设备、读取输入事件、以及对输入事件进行相应的处理。

        示例:

// example of using input subsystem API
#include <linux/input.h>  
int fd = open("/dev/input/event0", O_RDONLY);
struct input_event ev;
while (1) {
    read(fd, &ev, sizeof(struct input_event));
    if (ev.type == EV_KEY && ev.value >= 0 && ev.value <= 2)
        printf("(%ld.%06ld) key %d %s\n", ev.time.tv_sec, ev.time.tv_usec, ev.code, 
               (ev.value == 0) ? "release" : ((ev.value == 1) ? "press" : "auto repeat"));
}
close(fd);

        这个示例中,应用程序通过输入子系统API监听键盘事件,并输出键盘按下、释放和自动重复的事件。

五、总结

        通过输入子系统,Linux系统可以支持多种类型的输入设备,包括键盘、鼠标、触摸屏、游戏手柄等,为用户提供了灵活、统一的输入体验。输入子系统的设计使得用户可以方便地开发各种交互式应用程序,从而实现更丰富的用户交互和控制功能。

        更多C语言Linux系统相关文章,关注专栏:

   手撕C语言

            玩转linux

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode每日一题Day1——买卖股票的最佳时机

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

青大数据结构【2016】

一、单选 二、简答 3.简述遍历二叉树的含义及常见的方法。

shiro550反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

漏洞原理 本文所有使用的脚本和工具都会在文末给出链接&#xff0c;希望读者可以耐心看到最后。 啥是shiro? Shiro是Apache的一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。使用 Shiro 易于理解的 API&#xff0c;可以快速轻松地对应用程序进行保…

代码随想录算法训练营之JAVA|第十七天| 654. 最大二叉树

今天是第17天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 654. 最大二叉树https://leetcode.cn/problems/maximum-binary-tree/description/ 第一想法 错误的想法&#xff0c;就不说了。 看完代码随想录之后的想法 用递归模拟真实的过程 如果我…

【iOS】通知原理

我们可以通过看通知的实现机制来了解通知中心是怎么实现对观察者的引用的。由于苹果对Foundation源码是不开源的&#xff0c;我们具体就参考一下GNUStep的源码实现。GNUStep的源码地址为&#xff1a;GNUStep源码GitHub下载地址, 具体源码可以进行查看。 通知的主要流程 通知全…

AD21 PCB设计的高级应用(二)PCB常见走线等长设计

&#xff08;二&#xff09;PCB常见走线等长设计 1.蛇形线的等长设计2.DDR的等长分组3.等长的拓扑结构3.1 点对点连接3.2 T型拓扑结构3.3 菊花链拓扑结构 1.蛇形线的等长设计 在 PCB 设计中,网络等长调节目的就是为了尽可能地降低信号在 PCB上传输延迟的差异。在 Altium Desig…

C语言第十三课--------初阶指针的认识--------重要部分

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

JavaSE类和对象(重点:this引用、构造方法)

目录 一、类的定义方式以及实例化 1.面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在Java的世界里一切皆为对象。 2.类的定义和使用 1.在java中定义类时需要用到class关键字 3.类的实例化 4.类实例化的使用 二、this引用 …

面试中常聊 AMS,你是否又真的了解?

在面试的时候&#xff0c;经常会被问到这些问题&#xff1a; 对Activity的启动流程了解吗&#xff1f;AMS在Android起到什么作用&#xff0c;简单分析下Android的源码system_server为什么要在Zygote中启动&#xff0c;而不是由init直接启动呢?为什么要专门使用Zygote进程去孵…

有点慌,新公司项目构建用的Gradle

入职新公司&#xff0c;构建项目的工具用的gradle&#xff0c;以前没用过&#xff0c;看到一个build.gradle&#xff0c;点进去&#xff0c;心里一句我曹&#xff0c;这写的都是些什么玩意&#xff0c;方得一批&#xff0c;赶紧去补了下课。 好吧&#xff0c;先学点语法&#…

根据选择内容自动生成正则表达式

地址: https://regex.ai/ 如何使用? 比如我这里有个需求: 提取图片路径中的文件名 https://wx4.sinaimg.cn/mw1024/0040jbadly1hg5nk0l3gtj62c0340kjl02.jpg 提取出0040jbadly1hg5nk0l3gtj62c0340kjl02.jpg 数据越多越准确 左边提供数据, 右边给出需要提取的数据, 点击run&…

地产变革中,物业等风来

2023年7月&#xff0c;也许是中国房地产行业变局中的一个大拐点。 中信建投研报表示&#xff0c;政治局会议指出当前我国房地产形势已发生重大变化&#xff0c;要适时调整优化政策&#xff0c;为行业形势定调……当前房地产行业β已至。 不久前&#xff0c;国家统计局公布了2…

Mag-Fluo-4 AM,镁离子荧光探针,是一种有用的细胞内镁离子指示剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----产品描述&#xff1a; 镁离子荧光探针Mag-Fluo-4 AM&#xff0c;具细胞膜渗透性&#xff0c;对镁离子&#xff08;Mg2&#xff09; 和钙离子&#xff08;Ca2&#xff09;的 Kd 值分别是 4.7mM 和 22mM&#xff0c…

运维:Multipass软件让你的虚拟机管理更简单高效

一、Multipass是什么&#xff1f; 官网&#xff1a;https://multipass.run/ 一提到虚拟机大家一般都会想到VMvare和Virtual Box这两个的虚拟机软件&#xff0c;这两个软件一个比较麻烦的地方是安装完虚拟机以后还需要下载操作系统镜像。小编偶然间发现了Multipass。这款轻量级的…

Flowable-子流程-嵌套子流程

目录 定义图形标记XML内容使用示例视频讲解 定义 内嵌子流程又叫嵌入式子流程&#xff0c;它是一个可以包含其它活动、分支、事件&#xff0c;等的活动。我们通 常意义上说的子流程通常就是指的内嵌子流程&#xff0c;它表现为将一个流程&#xff08;子流程&#xff09;定义在…

【C语言初阶(20)】调试练习题

文章目录 前言实例1实例2 前言 在我们开始调试之前&#xff0c;应该有个明确的思路&#xff1b;程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。这些东西在调试之前都需要先确认下来&#xff0c;不然自己都不知道自己在调试个什么东西…

IT服务管理学习笔记<一>

### IT服务管理知识整理 ITSM 的核心思想是&#xff0c;IT 组织&#xff0c;不管它是企业内部的还是外部的&#xff0c;都是 IT 服务提供者&#xff0c;其 主要工作就是提供低成本、高质量的 IT 服务。 ITSM 的核心思想是&#xff0c;IT 组织&#xff0c;不管它是企业内部的还…

中国农村大学生学习了这个【React教程】迎娶导师女儿,出任CEO走上人生巅峰

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录 React创建一个简单的 JSX 元素创建一个复杂的 JSX 元素在 JSX 中添加注释渲染 HTML 元素为 DOM 树 &#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢…

《数据同步-NIFI系列》Nifi配置DBCPConnectionPool连接SQL Server数据库

Nifi配置DBCPConnectionPool连接SQL Server数据库 一、新增DBCPConnectionPool 在配置中新增DBCPConnectionPool&#xff0c;然后配置数据库相关信息 二、配置DBCPConnectionPool 2.1 DBCPConnectionPool介绍 主要介绍以下五个必填参数 Database Connection URL&#xff1…

简历上的项目,需要这样描述才有亮点!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言&#xff1b;豆包不是干粮 每每准备面试&#xff0c;总有些小伙子甩出自己的豆包项目&#xff0c;不是Xxx管理系统&…