当前位置: 首页 > news >正文

安徽建设学校官方网站安全员考试成绩查询网

安徽建设学校官方网站,安全员考试成绩查询网,如何做彩票网站推广图,十个无聊又有趣的网站本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心,视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发…

本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心,视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发完全手册V5.3_IMX6ULL_Pro开发板。
摘要:这节博客主要讲的是,文本特性设置,以及怎么用vs code调试去逐行理解代码,明白其工作原理。文字内容方面不做过多的研究,今后有需求再深入。
摘要关键词:文本特性设置、vs code调试

本文详细介绍以下问题,如果你遇到了以下问题,看看我的方案能否解决。

 hexdump /dev/input/event1

在这里插入图片描述

ls /dev/input/* -l

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这段代码是一个 Linux 下获取输入设备信息的程序,特别是用于读取 /dev/input/eventX 设备的信息,通常用于获取键盘、鼠标等输入设备的类型和属性。我们逐行分析:


#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>/* ./01_get_input_info /dev/input/event0 */
int main(int argc, char **argv)
{int fd;int err;int len;int i;unsigned char byte;int bit;struct input_id id;unsigned int evbit[2];char *ev_names[] = {"EV_SYN ","EV_KEY ","EV_REL ","EV_ABS ","EV_MSC ","EV_SW	","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","EV_LED ","EV_SND ","NULL ","EV_REP ","EV_FF	","EV_PWR ",};if (argc != 2){printf("Usage: %s <dev>\n", argv[0]);return -1;}fd = open(argv[1], O_RDWR);if (fd < 0){printf("open %s err\n", argv[1]);return -1;}err = ioctl(fd, EVIOCGID, &id);if (err == 0){printf("bustype = 0x%x\n", id.bustype );printf("vendor	= 0x%x\n", id.vendor  );printf("product = 0x%x\n", id.product );printf("version = 0x%x\n", id.version );}len = ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), &evbit);if (len > 0 && len <= sizeof(evbit)){printf("support ev type: ");for (i = 0; i < len; i++){byte = ((unsigned char *)evbit)[i];for (bit = 0; bit < 8; bit++){if (byte & (1<<bit)) {printf("%s ", ev_names[i*8 + bit]);}}}printf("\n");}return 0;
}

#include <linux/input.h>:包含了输入设备相关的定义,主要是 input_id 结构体和 EV_* 常量,后者定义了输入设备支持的事件类型(例如按键、相对移动等)
在这里插入图片描述

#include <sys/types.h> 和 #include <sys/stat.h>:包含了文件系统和文件类型相关的结构体和常量
在这里插入图片描述
#include <fcntl.h>:提供了文件操作的常量和函数,例如打开文件(open()),但是如上图所示,可以看到,其实有3个头文件需要包括。
#include <sys/ioctl.h>:用于进行设备控制的输入/输出控制(ioctl)操作
#include <stdio.h>:标准输入输出库,用于打印信息到控制台

    int fd;int err;int len;int i;unsigned char byte;int bit;struct input_id id;unsigned int evbit[2];char *ev_names[] = {"EV_SYN ","EV_KEY ","EV_REL ","EV_ABS ","EV_MSC ","EV_SW ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","NULL ","EV_LED ","EV_SND ","NULL ","EV_REP ","EV_FF ","EV_PWR ",};

fd:文件描述符,用于操作设备文件。
err:用于存储函数调用返回的错误码。
len:保存返回的设备信息长度。
i:用于循环遍历。
byte 和 bit:用于按位操作输入事件类型(evbit 数组)。
id:存储输入设备的标识信息,类型为 struct input_id,它包含 bustype, vendor, product, 和 version 等字段。
evbit[2]:用于存储设备支持的事件类型的位图。
ev_names[]:保存了输入事件类型对应的字符串,索引和位图值一一对应

    if (argc != 2){printf("Usage: %s <dev>\n", argv[0]);return -1;}

该部分检查命令行参数的个数,如果不等于 2(即没有提供设备路径),就输出使用提示并退出。

    fd = open(argv[1], O_RDWR);if (fd < 0){printf("open %s err\n", argv[1]);return -1;}

使用 open() 打开指定的设备文件(如 /dev/input/event0),并以可读写模式打开。如果打开失败(fd < 0),打印错误信息并退出。

    err = ioctl(fd, EVIOCGID, &id);if (err == 0){printf("bustype = 0x%x\n", id.bustype );printf("vendor = 0x%x\n", id.vendor );printf("product = 0x%x\n", id.product );printf("version = 0x%x\n", id.version );}

使用 ioctl() 函数发起 EVIOCGID 请求,获取设备的标识信息(如总线类型、厂商 ID、产品 ID 和版本号)。如果获取成功,则打印出这些信息。

    len = ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), &evbit);if (len > 0 && len <= sizeof(evbit)){printf("support ev type: ");for (i = 0; i < len; i++){byte = ((unsigned char *)evbit)[i];for (bit = 0; bit < 8; bit++){if (byte & (1<<bit)) {printf("%s ", ev_names[i*8 + bit]);}}}printf("\n");}

使用 ioctl() 获取设备支持的事件类型。EVIOCGBIT() 是一个宏,获取指定事件类型(0 表示主事件类型)的位图,返回长度存入 len,并将位图数据保存在 evbit 数组中。
如果 len 大于 0 且小于等于 evbit 的大小,表示获取到有效数据。程序会遍历 evbit 数组,按位检查每一位是否为 1,如果为 1,就输出对应的事件类型名称(如 EV_KEY, EV_ABS 等)。

该程序的功能是打开一个输入设备文件(如 /dev/input/event0),通过 ioctl 获取设备的标识信息和支持的事件类型,并将这些信息输出到控制台。这个程序对于调试和开发输入设备驱动有帮助,可以帮助开发者了解设备支持的事件类型和硬件信息。

2.signal函数
参考手册P218页可以看到,IO控制信号使用的是此函数。

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

本人认为它最关键的就是这两行代码。
typedef void (*sighandler_t)(int);这行代码是重定义了一个viod类型的指针函数,接受一个int类型的参数,typedef 是用来定义类型别名的关键字。
sighandler_t signal(int signum, sighandler_t handler);则是将signal函数指定为上述函数类型
signal() 函数的作用是设置信号处理函数。当特定的信号(比如 SIGINT)发生时,操作系统会调用这个处理函数。这个函数的返回类型是 sighandler_t,即指向信号处理函数的指针。
handler:是一个函数指针,类型是 sighandler_t,它指向一个信号处理函数。当信号发生时,该函数将被调用。这个函数的返回类型是 void,并接受一个 int 类型的参数(通常是信号编号)。

本质上是用了两次接受一个 int 类型的参数,并返回 void类型的函数,等效函数如下所示。

void (*signal(int signum, void (*handler)(int)))(int);

到此我就有一个疑问,参数声明为什么要括在外面呢,不能写在括号里面吗?
主要原因是在 C 语言中,函数指针的声明语法有点特殊,它通常会使用括号来明确指针的优先级。

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
cd test
arm-buildroot-linux-gnueabihf-gcc -o 05_input_read_fasync 05_input_read_fasync.c
adb push 05_input_read_fasync /root
./05_input_read_fasync /dev/input/event0

在这里插入图片描述

http://www.yayakq.cn/news/803739/

相关文章:

  • 制作公司网站多少钱广州市研发网站建设价格
  • 会唐网做网站有服务器做网站
  • 苏州网站建设熊掌构建网站系统
  • 凡科网站怎么做授权查询微商手机网站制作
  • 有一个网站怎么做cpc网站是做推广好还是优化好
  • 免费网站后台模板下载iis 网站设置
  • 济南专业网站设计苏州做商城网站
  • 做pc端网站用什么框架做网站推广的前期条件
  • 黄浦专业做网站经典软文案例50字
  • 上海品划网站建设有限公司游戏开发语言
  • 长春做网站选长春万网东莞营销型网站建设
  • 做ppt做好的网站怎么建网上商城
  • 做靓号网站明光市建设局网站
  • 运河建设集团网站专门做美妆的网站
  • 响应式外贸营销网站网络架构师证书
  • 象山县建设局网站重庆妇科医院咨询
  • 网页站点文件夹外贸网站怎么做效果好
  • 软路由做网站计算机专业培训机构排名
  • 做论坛网站如何赚钱的宿州网站建设推广
  • 网站刷链接怎么做的网站模板去哪要
  • 织梦做网站的教程怎么制作网站模版
  • 长丰县重点工程建设管理局网站51zwd一起做网站
  • 网站制作模板教案上海模板网站建设
  • 南通丰汇建设有限公司公司网站黑镜wordpress
  • 怎么自己设计房子效果图软件定制网站优化 seo一站式
  • 金融业反洗钱培训网站世界互联网峰会
  • 哈尔滨做网站收费特定ip段访问网站代码
  • 哈尔滨高端品牌网站建设竭诚网络网站建设公司
  • 三项措施做好门户网站建设广州网站开发哪家好
  • 广州网站建设招标网站添加百度商桥