讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux应用开发【第三章】输入系统应用开发

小辰姑娘_9209

小辰姑娘_9209

发布时间:2025-06-25 10:24:21

|

889人浏览过

|

来源于php中文网

原创

文章目录3 输入系统应用开发3.1 什么是输入系统?3.2 输入系统应用框架描述3.3 输入系统事件的读取与分析3.4 输入系统应用编程实战一:通用USB鼠标事件读取3.5 输入系统应用编程实战二:通用键盘事件读取3.6 输入系统应用编程实战三:百问网imx6ul开发板触摸屏事件读取3 输入系统应用开发3.1 什么是输入系统?

​ 在了解输入系统之前,先来了解什么是输入设备?常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与linux系统进行数据交换,linux系统为了统一管控和处理这些设备,于是就实现了一套固定的与硬件无关的输入系统框架,供用户空间程序使用,这就是输入系统。

3.2 输入系统应用框架描述

​ 在Linux输入系统中,主要分三层进行管理,分别是input core(输入系统核心层)、drivers(输入系统驱动层)以及event handlers(输入系统事件层),如下图所示,这就是Linux输入系统的基本框架:

Linux应用开发【第三章】输入系统应用开发

​ 举个非常简单的例子,比如用户按下键盘里的其中一个按键,它遵循流程是这样的:

​ 按键按下–>输入系统驱动层–>输入系统核心层–>输入系统事件层—>用户空间

​ 对于应用程序软件编程的角度,我们只需要关注用户空间是怎么得到按键按下以后获取的是什么事件就可以了,例如我想知道我当前按下的按是短按还是长按?或者我想知道当前我按下键盘的是空格键还是回车键等等。

3.3 输入系统事件的读取与分析

​ 用户空间的设备节点那么多,怎么知道当前是哪个设备上报的呢?例如想知道键盘是由哪个设备节点上报的,就可以通过以下这条指令来获取:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">cat /proc/bus/input/devices</code>

​ 这条指令的含义就是获取与event对应的相关设备信息,在ubuntu系统上,我们输入这个指令可以看到以下结果:

Linux应用开发【第三章】输入系统应用开发

​ 那么这里的I、N、P、S、U、H、B对应的每一行是什么含义呢?

I:id of the device(设备ID)

该参数由结构体struct input_id来进行描述

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">41 struct input_id {42 //总线类型43 __u16 bustype;44 //与厂商相关ID45 __u16 vendor;46 //与产品相关ID47 __u16 product;48 //版本ID49 __u16 version;50 };</code>

N:name of the device

设备名称

P:physical path to the device in the system hierarchy

系统层次结构中设备的物理路径。

S:sysfs path

位于sys文件系统的路径

U:unique identification code for the device(if device has it)

设备的唯一标识码

H:list of input handles associated with the device.

与设备关联的输入句柄列表。

B:bitmaps(位图)

PROP:device properties and quirks.

EV:types of events supported by the device.

KEY:keys/buttons this device has.

MSC:miscellaneous events supported by the device.

LED:leds present on the device.

PROP:设备属性和怪癖。

EV:设备支持的事件类型。

KEY:此设备具有的键/按钮。

MSC:设备支持的其他事件。

LED:设备上的指示灯。

通过了解以上参数的含义,结合以下指令

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">cat /proc/bus/input/devices</code>

显示出来的信息很容易可以知道event1即是键盘上报的事件设备节点,通过读取这个event1即可获得当前用户按下的按键具体是哪个事件。

使用cat命令来测试键盘事件

Linux应用开发【第三章】输入系统应用开发

当我们在终端输入

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">cat /dev/input/event1</code>

​ 这条指令并按回车键后可以看到一堆乱码数据,这些数据我们看不懂,但是我们可以知道如果按下了按键,终端有反馈消息,这时候就知道这个事件就是我们当前操作的这个设备上报的事件,那么如何能让这些数据看得懂呢?这时候可以使用hexdump命令来读取键盘事件。

使用hexdump命令来测试键盘事件

Linux应用开发【第三章】输入系统应用开发

这些数值是通过input_event结构体来上报的,它位于/usr/include/linux/input.h这个头文件,input_event结构体描述如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">24 struct input_event {25 //事件发生的事件26 struct timeval time;27 //事件类型28 __u16 type;29 //事件值30 __u16 code;31 //该事件上报的数值32 __s32 value;33 };</code>

而input_event结构体中的time即是:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">1 struct timeval2 {3 __time_t tv_sec;        /* Seconds. */4 __suseconds_t tv_usec;    /*Microseconds. */5 };</code>

​ 其中tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头,Epoch的意思是指定为1970年一月一日凌晨零点零分零秒,格林威治时间。

​ 回到input_event结构体,事件类型type主要有以下三种,分别是:相对事件、绝对事件、键盘事件

​ 例如:鼠标就是一个相对事件,有些情况下也有可能是绝对事件,当移动鼠标的时候,type类型也就是底层上报给用户的事件类型,那么code表示的就是相对于鼠标当前的位置的X或者Y的坐标,value则表示相对于当前的位置偏移了多少。

事件类型(type)

文件头文件路径:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input-event-codes.h</code>

当然Linux内核版本较低的有可能在以下路径的这个头文件:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input.h</code>
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">34 /*35  * Event types36  */37 38 #define EV_SYN0x00//同步事件39 #define EV_KEY0x01//按键事件40 #define EV_REL0x02//相对事件41 #define EV_ABS0x03//绝对事件42 #define EV_MSC0x0443 #define EV_SW0x0544 #define EV_LED0x1145 #define EV_SND0x1241246 #define EV_REP0x1447 #define EV_FF0x1548 #define EV_PWR0x1649 #define EV_FF_STATUS0x1750 #define EV_MAX0x1f51 #define EV_CNT(EV_MAX+1)</code>

事件值(code)

由于事件值种类繁多,这里就不一一列举出来,这里举例键盘的部分事件值:

文件头文件路径:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input-event-codes.h</code>

当然Linux内核版本较低的有可能在以下路径的这个头文件:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input.h64 /*65  * Keys and buttons66  *67  * Most of the keys/buttons are modeled after USB HUT 1.1268  * (see http://www.usb.org/developers/hidpage).69  * Abbreviations in the comments:70  * AC - Application Control71  * AL - Application Launch Button72  * SC - System Control73  */74 75 #define KEY_RESERVED076 #define KEY_ESC177 #define KEY_1278 #define KEY_2379 #define KEY_3480 #define KEY_4581 #define KEY_5682 #define KEY_6783 #define KEY_7884 #define KEY_8985 #define KEY_91086 #define KEY_01187 #define KEY_MINUS1288 #define KEY_EQUAL1389 #define KEY_BACKSPACE1490 #define KEY_TAB1591 #define KEY_Q1692 #define KEY_W17...</code>

当然还有鼠标事件值、摇杆事件值、触摸屏事件值等等。

该事件上报的数值(value)

​ 这部分上面已经举了鼠标的案例进行了介绍,接下来我们就通过应用程序来获取事件,后面章节将会通过鼠标、键盘以及触摸屏三个案例,进一步的了解输入系统的应用编程。

3.4 输入系统应用编程实战一:通用USB鼠标事件读取

​ 根据前面章节的讲解,如果我们需要获取USB鼠标的事件,首先我们要先通过cat /proc/bus/input/devices这个指令查询与USB鼠标事件对应的相关设备信息,通过实际测试得知,event2为USB鼠标上报的事件节点。

Linux应用开发【第三章】输入系统应用开发

接下来,通过hexdump命令测试一下鼠标事件的输出:

Computer Use Linux
Computer Use Linux

顶级 Linux 计算机使用技能,配套独立自举运行时,无需本地 Claude 安装、私有原生模块等。

下载
Linux应用开发【第三章】输入系统应用开发

​ 具体上报的数值是什么含义可以结合3.3章节进行分析,这里就不再进行阐述,本节的目的是编写一个获取通用USB鼠标的事件的应用程序,要获取一个事件,我们需要了解以下几个部分。

1 设备上报事件类型(type)

通过3.3章节,我们知道找到对应的事件类型的定义:

文件头文件路径:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input-event-codes.h</code>

当然Linux内核版本较低的有可能在以下路径的这个头文件:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input.h</code>
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">34 /*35  * Event types36  */37 38 #define EV_SYN0x00//同步事件39 #define EV_KEY0x01//按键事件40 #define EV_REL0x02//相对事件41 #define EV_ABS0x03//绝对事件42 #define EV_MSC0x0443 #define EV_SW0x0544 #define EV_LED0x1145 #define EV_SND0x1241246 #define EV_REP0x1447 #define EV_FF0x1548 #define EV_PWR0x1649 #define EV_FF_STATUS0x1750 #define EV_MAX0x1f51 #define EV_CNT(EV_MAX+1)</code>

2 设备上报的事件值(code)

由于本节我们写的是通用USB鼠标的应用程序,所以我们找到鼠标相关的code,如下:

文件头文件路径:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input-event-codes.h</code>

当然Linux内核版本较低的有可能在以下路径的这个头文件:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/usr/include/linux/input.h</code>
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">696 /*697  * Relative axes698  */699 700 #define REL_X0x00//相对X坐标701 #define REL_Y0x01//相对Y坐标702 #define REL_Z0x02703 #define REL_RX0x03704 #define REL_RY0x04705 #define REL_RZ0x05706 #define REL_HWHEEL0x06707 #define REL_DIAL0x07708 #define REL_WHEEL0x08709 #define REL_MISC0x09710 #define REL_MAX0x0f711 #define REL_CNT(REL_MAX+1)</code>

在这里,我们暂时只会用来REL_X和REL_Y这两个参数。

​ 那么所谓的value,就是选择具体的事件类型(type)和具体的事件值(code)以后所反应出来的值,鼠标就是相对于当前X或者相对于当前Y的值,接下来,我们来看一下如何来读取鼠标事件。

在编写input应用程序之前,在程序中需要包含以下头文件:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include <linux/input.h></code>

程序编写步骤:

1 定义一个结构体变量input_event用于描述input事件

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">struct input_event event_mouse ;</code>

2 打开input设备的事件节点,这里我们获取的通用USB鼠标是event2

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">open("/dev/input/event2",O_RDONLY);</code>

3 读取事件

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">read(fd ,&event_mouse ,sizeof(event_mouse));</code>

4 根据上报的事件进行处理

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">//判断鼠标上报的类型,可能为绝对事件,也有可能是相对事件if(EV_ABS == event_mouse.type || EV_REL == event_mouse.type){   //code表示相对位移X或者Y,当判断是X时,打印X的相对位移value   //当判断是Y时,打印Y的相对位移value   if(event_mouse.code == REL_X)   {      printf("event_mouse.code_X:%d\n", event_mouse.code);      printf("event_mouse.value_X:%d\n", event_mouse.value);   }   else if(event_mouse.code == REL_Y)   {      printf("event_mouse.code_Y:%d\n", event_mouse.code);      printf("event_mouse.value_Y:%d\n", event_mouse.value);   }}</code>

5 关闭文件描述符

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">close(fd);</code>

不难发现,获取一个输入系统事件,也是标准的文件操作,这体现了Linux一切皆文件的思想。

完整的程序案例如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">01 #include <stdio.h>02 #include <unistd.h>03 #include <stdlib.h>04 #include <fcntl.h>05 #include <linux/input.h>06 07 int main(void)08 {09     //1、定义一个结构体变量用来描述input事件10     struct input_event event_mouse ;11     //2、打开input设备的事件节点  我的通用USB鼠标事件的节点是event212     int fd    = -1 ;13    fd = open("/dev/input/event2", O_RDONLY);14     if(-1 == fd)15     {16         printf("open mouse event fair!\n");17         return -1 ;18     }19     while(1)20     {21         //3、读事件22         read(fd, &event_mouse, sizeof(event_mouse));23    if(EV_ABS == event_mouse.type || EV_REL == event_mouse.type)24    {25             //code表示相对位移X或者Y,当判断是X时,打印X的相对位移value26    //当判断是Y时,打印Y的相对位移value27             if(event_mouse.code == REL_X)28             {29    printf("event_mouse.code_X:%d\n", event_mouse.code);30                 printf("event_mouse.value_X:%d\n", event_mouse.value);31             }32             else if(event_mouse.code == REL_Y)33             {34                 printf("event_mouse.code_Y:%d\n", event_mouse.code);35                 printf("event_mouse.value_Y:%d\n", event_mouse.value);36             }37 }38     }39     close(fd);40     return 0 ;41 }</code>

代码编写完毕后,然后执行

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">gcc test_mouse.c -o test_mouse</code>

编译程序:

Linux应用开发【第三章】输入系统应用开发

编译成功后会生成test_mouse,接下来执行test_mouse这个程序。

当鼠标左右移动的时候上报的事件:

Linux应用开发【第三章】输入系统应用开发

这时候可以看到,只有相对于X的事件值在发生,这时候打印的value是X方向相对于原点坐标的偏移值。

当鼠标上下移动的时候上报的事件:

Linux应用开发【第三章】输入系统应用开发

这时候可以看到,只有相对于Y的事件值在发生,这时候打印的value是Y方向相对于原点坐标的偏移值。

3.5 输入系统应用编程实战二:通用键盘事件读取

​ 如何获取键盘事件在3.3章节已经有了相应的介绍,这里就不再写出来,本节实现的是通用键盘事件的获取,结合3.4章节获取鼠标事件的方式,这里通用键盘事件的节点为event1,通过结合3.3章节与3.4章节,编写步骤如下:

在编写input应用程序之前,在程序中需要包含以下头文件:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include <linux/input.h></code>

程序编写步骤:

1 定义一个结构体变量input_event用于描述input事件

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">struct input_event event_keyboard ;</code>

2 打开input设备的事件节点,我的通用键盘事件的节点是event1

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">open("/dev/input/event1",O_RDONLY);</code>

3 读取事件

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">read(fd ,&event_keyboard ,sizeof(event_keyboard));</code>

4 根据上报的事件进行处理

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">//判断键盘事件上报的类型if(EV_KEY == event_keyboard.type){    if(1 == event_keyboard.value)      printf("事件类型:%d  事件值:%d 按下\n", event_keyboard.type,          event_keyboard.code);    else if(0 == event_keyboard.value)      printf("事件类型:%d  事件值:%d 释放\n", event_keyboard.type, event_keyboard.code);}</code>

5 关闭文件描述符

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">close(fd);</code>

完整程序案例实现如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">01 #include <stdio.h>02 #include <unistd.h>03 #include <stdlib.h>04 #include <fcntl.h>05 #include <linux/input.h>06 07 int main(void)08 {09     //1、定义一个结构体变量用来描述input事件10     struct input_event event_keyboard ;11     //2、打开input设备的事件节点  我的通用键盘事件的节点是event112     int fd    = -1 ;13    fd = open("/dev/input/event1", O_RDONLY);14     if(-1 == fd)15     {16         printf("open mouse event fair!\n");17         return -1 ;18     }19     while(1)20     {21         //3、读事件22         read(fd, &event_keyboard, sizeof(event_keyboard));23    if(EV_KEY == event_keyboard.type)24    {25 if(1 == event_keyboard.value)26 printf("事件类型:%d  事件值:%d 按下\n",event_keyboard.type,event_keyboard.code);27 else if(0 == event_keyboard.value)28 printf("事件类型:%d  事件值:%d 释放\n",event_keyboard.type,event_keyboard.code);29 }30     }31     close(fd);32     return 0 ;33 }</code>

​ 不难发现,通用USB键盘程序编写步骤与通用USB鼠标程序编写步骤几乎一样,区别只是读取的事件类型以及后面处理的数据value不同。

代码编写完毕后,然后执行

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">gcc test_keyboard.c -o test_keyboard</code>

编译程序:

Linux应用开发【第三章】输入系统应用开发

编译成功后会生成test_keyboard,接下来执行test_keyboard这个程序。

Linux应用开发【第三章】输入系统应用开发

当按下按键时候,可以观察到按键的按下和释放的过程,这其实就是同一个事件下的两个不同的状态。

3.6 输入系统应用编程实战三:百问网imx6ul开发板触摸屏事件读取

​ 在前面,我们已经熟悉了鼠标、键盘的基本操作,但发现一个规律,那就是编程方法类似,唯一不同的地方就是获取的事件类型以及事件值不同,那么触摸屏在input系统中是一类什么事件呢?

​ 一般情况下,触摸屏在input系统中属于绝对事件,也就是触摸的坐标点X和Y会在屏幕的分辨率范围内上报一个绝对的坐标。

绝对事件对应的值为:EV_ABS

相应X和Y分量的值分别为:

ABS_MT_POSITION_X、ABS_MT_POSITION_Y

通过结合前面的章节内容,很容易编写如下程序:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">01 #include <stdio.h>02 #include <unistd.h>03 #include <fcntl.h>04 #include <stdlib.h>05 #include <linux/input.h>06 07 int main(int argc, char **argv)08 {09     int tp_fd  = -1 ;10     int tp_ret = -1 ;11     int touch_x,touch_y ;12     struct input_event imx6ull_ts ;  13     //1、打开触摸屏事件节点14     tp_fd = open("/dev/input/event1",O_RDONLY);15     if(tp_fd < 0)16     {17        printf("open /dev/input/event1 fail!\n");18        return -1 ;19     }20     while(1)21     {  22  //2、获取触摸屏相应的事件,并打印出当前触摸的坐标23          read(tp_fd ,&imx6ull_ts ,sizeof(imx6ull_ts));  24          switch(imx6ull_ts.type)25  {  26     case EV_ABS:  27  if(imx6ull_ts.code == ABS_MT_POSITION_X)  28     touch_x = imx6ull_ts.value ;29  if(imx6ull_ts.code == ABS_MT_POSITION_Y) 30     touch_y = imx6ull_ts.value ;31  break ;32  defalut:  33  break ;  34  }     35  printf("touch_x:%d touch_y:%d\n",touch_x,touch_y);36  usleep(100);37     }38     close(tp_fd);39     return 0;40 }</code>

代码编写完毕后,然后执行

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">gcc test_touchscreen.c -o test_touchscreen</code>

交叉编译程序:(注意这里是要在开发板运行,不是在PC端)

Linux应用开发【第三章】输入系统应用开发

接下来启动开发板,然后串口终端输出rz命令,等待接收PC端的文件,这里我们将test_touchscreen这个文件传输到开发板。

Linux应用开发【第三章】输入系统应用开发

具体操作步骤可参考第11章:PC和开发板之间传输文件

接下来给test_touchscreen添加可执行权限:

Linux应用开发【第三章】输入系统应用开发

执行test_touchscreen,然后用手触摸屏,可以看到有相应的坐标值打印:

Linux应用开发【第三章】输入系统应用开发

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4274

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4411

2025.07.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5087

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2268

2023.08.10

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

734

2023.11.24

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

3830

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3293

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2433

2023.06.30

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn