移植使用tslib 库

2023-11-09

上一章我们学习了如何编写触摸屏应用程序,包括单点触摸和多点触摸,主要是对读取到的struct input_event 类型数据进行剖析,得到各个触摸点的坐标。本章向大家介绍tslib 库,这是Linux 系统下,专门为触摸屏开发的应用层函数库,本章我们将学习如何基于tslib 库编写触摸屏应用程序。

tslib 简介

在这里插入图片描述
tslib 是专门为触摸屏设备所开发的Linux 应用层函数库,并且是开源,也就意味着我们可以直接获取到
tslib 的源代码,下一小节将向大家介绍如何获取到tslib 的源代码。
tslib 为触摸屏驱动和应用层之间的适配层,它把应用程序中读取触摸屏struct input_event 类型数据(这是输入设备上报给应用层的原始数据)并进行解析的操作过程进行了封装,向使用者提供了封装好的API 接口。tslib 从触摸屏中获得原始的坐标数据,并通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的触摸屏坐标转换为相应的屏幕坐标。
tslib 有一个配置文件ts.conf,该配置文件中提供了一些配置参数、用户可以对其进行修改,具体的配置信息稍后介绍!
tslib 可以作为Qt 的触摸屏输入插件,为Qt 提供触摸输入支持,如果在嵌入式Linux 硬件平台下开发过
Qt 应用程序的读者应该知道;当然,并不是只有tslib 才能作为Qt 的插件、为其提供触摸输入支持,还有很多插件都可以,只不过大部分都会选择使用tslib。
关于tslib 就介绍这么多,接下来看看如何将tslib 库移植到我们的开发板平台上。

tslib 移植

下载tslib 源码

首先下载tslib 源码包,进入到tslib 的git 仓库下载源码https://github.com/libts/tslib/releases,如下:
在这里插入图片描述
ALPHA/Mini 开发板出厂系统中已经移植了tslib,并且版本为1.16,可以在开发板执行ts_finddev 命令查看到它的版本信息,如下所示:
在这里插入图片描述
所以为了统一,我们也下载1.16 版本的tslib,往下翻找到1.16 版本的下载链接:
在这里插入图片描述
点击红框字样进入下载页面:
在这里插入图片描述
推荐下载tar.bz2 或tar.gz 格式压缩包,或者tar.xz 压缩包,这里笔者下载tar.gz 格式的压缩包文件,点击文字即可下载。
在这里插入图片描述

编译tslib 源码

将tslib-1.16.tar.gz 源码包拷贝到Ubuntu 系统的用户家目录下:
在这里插入图片描述
将其解压到当前目录下:

tar -xzf tslib-1.16.tar.gz

在这里插入图片描述
解压之后会生成tslib-1.16 目录,在家目录下创建一个tools 目录,然后在tools 目录下创建tslib 目录,等会编译tslib 库的时候将安装目录指定到这里,如下所示:
在这里插入图片描述
进入到tslib-1.16 目录,准备进行编译tslib 源码:
在这里插入图片描述
接下来进行编译,整个源码的编译分为3 个步骤:
⚫ 首先第一步是配置工程;
⚫ 第二步是编译工程;
⚫ 第三步是安装,将编译得到的库文件、可执行文件等安装到一个指定的目录下。
首先在配置工程之前,先对交叉编译工具的环境进行设置,使用source 执行交叉编译工具安装目录下的environment-setup-cortexa7hf-neon-poky-linux-gnueabi 脚本文件:

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

执行下面这条命令对tslib 源码工程进行配置:

./configure --host=arm-poky-linux-gnueabi --prefix=/home/dt/tools/tslib/

至于工程是如何配置的,大家可以执行./configure --help 查看它的配置选项以及含义,–host 选项用于指定交叉编译得到的库文件是运行在哪个平台,通常将–host 设置为交叉编译器名称的前缀,譬如arm-poky-linux-gnueabi-gcc 前缀就是arm-poky-linux-gnueabi;–prefix 选项则用于指定库文件的安装路径,我们将安装路径设置为之前在家目录下创建的tools/tslib 目录。
图18.2.10 配置工程

接着编译工程,直接执行make:

make

在这里插入图片描述
最后执行make install 安装:

make install

在这里插入图片描述

tslib 安装目录下的文件夹介绍

进入到tslib 安装目录下:
在这里插入图片描述
bin 目录
bin 目录下有一些tslib 提供的小工具,可以用于测试触摸屏,如下所示:
在这里插入图片描述
etc 目录
etc 目录下有一个配置文件ts.conf,前面给大家提到过,
图18.2.15 配置文件ts.conf

打开ts.conf 文件看看它有哪些配置选项:
在这里插入图片描述
module_raw input:取消注释,使能支持input 输入事件;
module pthres pmin=1:如果我们的设备支持按压力大小测试,那么可以把它的注释取消,pmin 用于调节按压力灵敏度,默认就是等于1。
module dejitter delta=100:tslib 提供了触摸屏去噪算法插件,如果需要过滤噪声样本,取消注释,默认参数delta=100。
module linear:tslib 提供了触摸屏坐标变换的功能,譬如将X、Y 坐标互换、坐标旋转等之类,如果我们需要实现坐标变换,可以把注释去掉。
这里就不去改动了,直接使用默认的配置就行了。
include 目录
include 目录下只有一个头文件tslib.h,该头文件中包含了一些结构体数据结构以及API 接口的申明,使用tslib 提供的API 就需要包含该头文件。
lib 目录
lib 目录下包含了编译tslib 源码所得到的库文件,默认这些都是动态库文件,也可以通过配置tslib 工程使其生成静态库文件;ts 目录下存放的是一些插件库。
图18.2.17 lib 目录

share 目录
可以忽略!

在开发板上测试tslib

移植的最后一步就是把tslib 安装目录下的库文件、etc 下的配置文件以及编译得到的测试工具拷贝到开发板Linux 系统目录下,由于开发板出厂系统中已经移植了tslib 库,所以我们这里就不用拷贝了。但如果大家是自己做的根文件系统,并没有移植tslib,那么就需要把这些库、可执行文件以及配置文件拷贝到根文件系统中,那怎么去拷贝?这里简单地提一下:
⚫ 将安装目录bin/目录下的所有可执行文件拷贝到开发板/usr/bin 目录下;
⚫ 将安装目录etc/目录下的配置文件ts.conf 拷贝到开发板/etc 目录下;
⚫ 将安装目录lib/目录下的所有库文件拷贝到开发板/usr/lib 目录下。
将安装目录下的测试工具、库文件以及配置文件拷贝到开发板之后,接着需要配置一些环境变量,因为
tslib 工作的时候它需要依赖于一些环境变量,譬如它会通过读取环境变量来得知ts.conf 配置文件、库文件的路径以及我们要测试的触摸屏对应的设备节点等。

export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts

TSLIB_CONSOLEDEVICE:用于配置控制台设备文件名,直接配置为none 即可!
TSLIB_FBDEVICE:用于配置显示设备的名称,tslib 提供了手指触摸画线的测试工具,需要在LCD 上显示,所以这里需要指定一个显示设备的设备节点。
TSLIB_TSDEVICE:用于配置触摸屏对应的设备节点,根据实际情况配置。
TSLIB_CONFFILE:用于配置ts.conf 文件的所在路径。
TSLIB_PLUGINDIR:用于配置插件所在路径。
在这里插入图片描述
如果想每次启动系统都能生效,可以把这些命令放置在/etc/profile 脚本中执行;出厂系统中已经配置好了,无需用户进行配置。
接着我们使用tslib 提供的测试工具测试触摸屏,它提供了单点触摸测试工具(ts_print、ts_test)和多点触摸测试工具(ts_print_mt、ts_test_mt),ts_print 和ts_print_mt 可以在终端打印触摸点信息,而ts_test 和
ts_test_mt 则支持在LCD 上画线。
执行ts_print 命令:
在这里插入图片描述
执行ts_print 命令之后,在触摸屏上滑动、或按下、松开触摸屏将会在终端打印出相应的信息。同理,
ts_print_mt 也是如此,不过它支持多点触摸,可以打印多个触摸点的信息:
图18.2.20 ts_print_mt 测试工具

ts_test 和ts_test_mt 支持触摸屏画线操作,这里就不再给演示了,自己去测试即可!如果大家想看这些测试工具的源码实现,可以在tslib 源码中找到,具体路径为tslib 源码目录下的tests 文件夹中:
图18.2.21 tests 文件夹

譬如ts_test 程序对应的源码实现为ts_test.c,不管它怎么做最终都是落实到上一章给大家介绍的内容中。

tslib 库函数介绍

本小节介绍如何使用tslib 提供的API 接口来编写触摸屏应用程序,使用tslib 库函数需要在我们的应用程序中包含tslib 的头文件tslib.h,使用tslib 编程其实非常简单,基本步骤如下所示:
第一步打开触摸屏设备;
第二步配置触摸屏设备;
第三步读取触摸屏数据。

打开触摸屏设备

使用tslib 提供的库函数ts_open 打开触摸屏设备,其函数原型如下所示:

#include "tslib.h"
struct tsdev *ts_open(const char *dev_name, int nonblock);

参数dev_name 指定了触摸屏的设备节点;参数nonblock 表示是否以非阻塞方式打开触摸屏设备,如果
nonblock 等于0 表示阻塞方式,如果为非0 值则表示以非阻塞方式打开。
调用成功返回一个struct tsdev *指针,指向触摸屏设备句柄;如果打开设备失败,将返回NULL。
除了使用ts_open()打开设备外,还可以使用ts_setup()函数,其函数原型如下所示:

#include "tslib.h"
struct tsdev *ts_setup(const char *dev_name, int nonblock)

参数dev_name 指定触摸屏的设备节点,与ts_open()函数中的dev_name 参数意义相同;但对于ts_setup()
来说,参数dev_name 可以设置为NULL,当dev_name 设置为NULL 时,ts_setup()函数内部会读取
TSLIB_TSDEVICE 环境变量,获取该环境变量的内容以得知触摸屏的设备节点。
参数nonblock 的意义与ts_open()函数的nonblock 参数相同。
ts_setup()相比ts_open(),除了打开触摸屏设备外,还对触摸屏设备进行了配置,也就是接下来说到的第二步操作。
关闭触摸屏设备使用ts_close()函数:
int ts_close(struct tsdev *);

配置触摸屏设备

调用ts_config()函数进行配置,其函数原型如下所示:

#include "tslib.h"
int ts_config(struct tsdev *ts)

参数ts 指向触摸屏句柄。
成功返回0,失败返回-1。
所谓配置其实指的就是解析ts.conf 文件中的配置信息,加载相应的插件。

读取触摸屏数据

读取触摸屏数据使用ts_read()或ts_read_mt()函数,区别在于ts_read 用于读取单点触摸数据,而
ts_read_mt 则用于读取多点触摸数据,其函数原型如下所示:

#include "tslib.h"
int ts_read(struct tsdev *ts, struct ts_sample *samp, int nr)
int ts_read_mt(struct tsdev *ts, struct ts_sample_mt **samp, int max_slots, int nr)

参数ts 指向一个触摸屏设备句柄,参数nr 表示对一个触摸点的采样数,设置为1 即可!
ts_read_mt()函数有一个max_slots 参数,表示触摸屏支持的最大触摸点数,应用程序可以通过调用ioctl()
函数来获取触摸屏支持的最大触摸点数以及触摸屏坐标的最大分辨率等信息,稍后向大家介绍。
ts_read()函数的samp 参数是一个struct ts_sample *类型的指针,指向一个struct ts_sample 对象,struct ts_sample 数据结构描述了触摸点的信息;调用ts_read()函数获取到的数据会存放在samp 指针所指向的内存中。struct ts_sample 结构体内容如下所示:

struct ts_sample
{
    int x;                 // X 坐标
    int y;                 // Y 坐标
    unsigned int pressure; // 按压力大小
    struct timeval tv;     // 时间
};

ts_read_mt()函数的samp 参数是一个struct ts_sample_mt **类型的指针,多点触摸应用程序,每一个触摸点的信息使用struct ts_sample_mt 数据结构来描述;一个触摸点的数据使用一个struct ts_sample_mt 对象来装载,将它们组织成一个struct ts_sample_mt 数组,调用ts_read_mt()时,将数组地址赋值给samp 参数。
struct ts_sample 结构体内容如下所示:

struct ts_sample_mt
{
    /* ABS_MT_* event codes. linux/include/uapi/linux/input-event-codes.h
     * has the definitions.
     */
    int x;                 // X 坐标
    int y;                 // Y 坐标
    unsigned int pressure; // 按压力大小
    int slot;              // 触摸点slot
    int tracking_id;       // ID
    int tool_type;
    int tool_x;
    int tool_y;
    unsigned int touch_major;
    unsigned int width_major;
    unsigned int touch_minor;
    unsigned int width_minor;
    int orientation;
    int distance;
    int blob_id;
    struct timeval tv; // 时间
    /* BTN_TOUCH state */
    short pen_down; // BTN_TOUCH 的状态
    /* valid is set != 0 if this sample
     * contains new data; see below for the
     * bits that get set.
     * valid is set to 0 otherwise
     */
    short valid; // 此次样本是否有效标志触摸点数据是否发生更新
};

基于tslib 编写触摸屏应用程序

通过对tslib 库函数的简单介绍,本小节来编写基于tslib 的触摸屏应用程序,包括单点触摸应用程序和多点触摸应用程序。

单点触摸应用程序

本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->18_tslib->ts_read.c。

#include <stdio.h>
#include <stdlib.h>
#include <tslib.h> //包含tslib.h 头文件
int main(int argc, char *argv[])
{
    struct tsdev *ts = NULL;
    struct ts_sample samp;
    int pressure = 0; // 用于保存上一次的按压力,初始为0,表示松开
    /* 打开并配置触摸屏设备*/
    ts = ts_setup(NULL, 0);
    if (NULL == ts)
    {
        fprintf(stderr, "ts_setup error");
        exit(EXIT_FAILURE);
    }
    /* 读数据*/
    for (;;)
    {
        if (0 > ts_read(ts, &samp, 1))
        {
            fprintf(stderr, "ts_read error");
            ts_close(ts);
            exit(EXIT_FAILURE);
        }
        if (samp.pressure)
        {                 // 按压力>0
            if (pressure) // 若上一次的按压力>0
                printf("移动(%d, %d)\n", samp.x, samp.y);
            else
                printf("按下(%d, %d)\n", samp.x, samp.y);
        }
        else
            printf("松开\n"); // 打印坐标
        pressure = samp.pressure;
    }
    ts_close(ts);
    exit(EXIT_SUCCESS);
}

代码非常简单,就不再解释了,直接打开、配置设备,接着读取数据即可!通过判断按压力大小确定触摸的状态,如果按压力等于0 则表示手指已经松开;按压力大于0,则需根据上一次的按压力是否大于0 来判断。
读取数据出错时,ts_read()返回一个负数。
接下来编译应用程序,编译代码时,需要通过交叉编译器来指定头文件、库文件的路径以及动态链接库文件名:

${CC} -I /home/dt/tools/tslib/include -L /home/dt/tools/tslib/lib -lts -o testApp testApp.c

图18.4.1 编译单点触摸应用程序

-I 选项指定头文件的路径,也就是指定tslib 安装目录下的include 目录,如果不指定头文件路径,编译时将会找不到tslib.h 头文件;-L 选项用于指定库文件的路径,也就是指定tslib 安装目录下的lib 目录;我们将tslib 编译成了动态库文件,以库文件的形式提供,编译时需要链接到这些库文件;而-l 选项则用于指定链接库(也可写成-l ts,也就是libts.so 库文件,Linux 中,动态库文件的命名方式为lib+名字+.so)。
将编译得到的可执行文件拷贝到开发板Linux 系统的用户家目录下,执行应用程序,进行测试:
在这里插入图片描述

多点触摸应用程序

本小节我们来写基于tslib 的多点触摸应用程序,使用ts_read_mt()函数读取多点触摸数据。
本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->18_tslib->ts_read_mt.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <tslib.h>
int main(int argc, char *argv[])
{
    struct tsdev *ts = NULL;
    struct ts_sample_mt *mt_ptr = NULL;
    struct input_absinfo slot;
    int max_slots;
    unsigned int pressure[12] = {0}; // 用于保存每一个触摸点上一次的按压力,初始为0,表示松开
    int i;
    /* 打开并配置触摸屏设备*/
    ts = ts_setup(NULL, 0);
    if (NULL == ts)
    {
        fprintf(stderr, "ts_setup error");
        exit(EXIT_FAILURE);
    }
    /* 获取触摸屏支持的最大触摸点数*/
    if (0 > ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT), &slot))
    {
        perror("ioctl error");
        ts_close(ts);
        exit(EXIT_FAILURE);
    }
    max_slots = slot.maximum + 1 - slot.minimum;
    printf("max_slots: %d\n", max_slots);
    /* 内存分配*/
    mt_ptr = calloc(max_slots, sizeof(struct ts_sample_mt));
    /* 读数据*/
    for (;;)
    {
        if (0 > ts_read_mt(ts, &mt_ptr, max_slots, 1))
        {
            perror("ts_read_mt error");
            ts_close(ts);
            free(mt_ptr);
            exit(EXIT_FAILURE);
        }
        for (i = 0; i < max_slots; i++)
        {
            if (mt_ptr[i].valid)
            { // 有效表示有更新!
                if (mt_ptr[i].pressure)
                {                                 // 如果按压力>0
                    if (pressure[mt_ptr[i].slot]) // 如果上一次的按压力>0
                        printf("slot<%d>, 移动(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y);
                    else
                        printf("slot<%d>, 按下(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y);
                }
                else
                    printf("slot<%d>, 松开\n", mt_ptr[i].slot);
                pressure[mt_ptr[i].slot] = mt_ptr[i].pressure;
            }
        }
    }
    /* 关闭设备、释放内存、退出*/
    ts_close(ts);
    free(mt_ptr);
    exit(EXIT_SUCCESS);
}

整个思路与单点触摸应用程序相同,关注for()循环内部,通过ts_read_mt()函数读取触摸点数据,将这些数据存放在mt_ptr 数组中,接着在fof()循环中判断每一个触摸点数据是否有效,有效则表示该触摸点信息发生更新。
编译应用程序:

${CC} -I /home/dt/tools/tslib/include -L /home/dt/tools/tslib/lib -lts -o testApp testApp.c

在这里插入图片描述
将编译得到的可执行文件拷贝到开发板Linux 系统的用户家目录下,执行程序:
在这里插入图片描述
slot<0>表示触摸点0,slot<1>表示触摸点1,以此类推,大家自己去测试,没什么可说的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移植使用tslib 库 的相关文章

  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • 如何将后台作业的输出分配给 bash 变量?

    我想在 bash 中运行后台作业并将其结果分配给一个变量 我不喜欢使用临时文件 并且希望同时运行多个类似的后台任务 root root var echo hello world root root echo var hello world
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • 未找到 Gem 命令

    我已经在 Ubuntu 10 10 32 位上安装了 gem apt get install gem y 但当我尝试跑步时 gem install something gem 我收到未找到命令的错误 bash gem command not
  • 如何从 Linux 内核模块获取使用计数?

    我对正在开发的内核模块的使用计数有疑问 我想打印它以进行调试 如何从模块代码中获取它 有问题的内核版本 Linux 2 6 32 module refcount http lxr linux no linux v2 6 34 1 inclu
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 可以作为命令行参数传递多少数据?

    在 Linux 下生成进程时可以发送多少字节作为命令行参数 gahooa 推荐了一篇好文章http www in ulm de mascheck various argmax http www in ulm de mascheck vari
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na

随机推荐

  • react 安装

    安装react脚手架 npm i g create react app 创建react项目 npx create react app react project react project为项目名
  • 使用ping检测MTU值

    ping ping Packet Internet Groper 是一种因特网包探索器 用于测试网络连接量的程序 Ping是工作在 TCP IP网络体系结构中应用层的一个服务命令 主要是向特定的目的主机发送 ICMP Internet Co
  • sql语句-如何以一个表中的数据为条件据查询另一个表中的数据

    下面这个是SQL语句的一个基本样式 select from 表2 where 姓名 in select 姓名 from 表1 where 条件 实例需求 在项目中是这样应用的 我需要根据库位编号去查找库位信息表里查找库位上放的的料箱编号 我
  • C++-----动态规划

    目录 一 动态规划的基本思想 二 设计动态规划法的步骤 三 动态规划问题的特征 4 1 矩阵连乘积问题 4 1 1 分析最优解的结构 4 1 2 建立递归关系 4 1 3 计算最优值 4 1 3 计算最优值 4 1 3 构造最优解 4 2
  • 面向对象设计原则——单一职责原则

    单一职责原则是最简单的面向对象设计原则 它用于控制类的粒度大小 单一职责原则 Single Responsibility Principle SRP 一个类只负责一个功能领域中的相应职责 或者可以定义为 就一个类而言 应该只有一个引起它变化
  • 移植python到小米路由器记录。

    最近抢了一个小米路由器 研究了一下 总的来说现在看起来功能还很少 现在比较有用的功能就是 远程下载功能 支持迅雷 电驴等 不过现在看电影啥的都是直接在线看的 基本上也很少用 检测连接的智能设备 这个功能可以随时查看是否有人曾网 当然也可以用
  • git项目初次push提示 error: failed to push some refs to ‘https://github.com/xxx

    问题描述 当你的项目不是先从远程仓库pull下来 再push的话 可能会出现 push被拒绝问题 rejected cfj gt cfj non fast forward error failed to push some refs to
  • 定义样式并获取上传文件路径及指定文件类型

  • dataframe显示数据处理进度

    显示效果如下 tqdm搭配progress apply使用 from tqdm import tqdm tqdm pandas desc pandas bar df result df score progress apply lambda
  • 发现一个bug如何定位是前端还是后台问题?

    1 经验法 软件测试人员应不断精进自己的技能 负责的项目多了 自然对功能的实现过程有了解 也就明白如何分类bug了 例如 网页上的某个图片的分辨率不对 如果我们了解实现过程 可以想到一般情况下 是根据某个地址去服务器取图片的 数据库一般只保
  • c/c++ 力扣LeetCode 645.错误的集合

    题目链接 力扣 645 错误的集合 不想戳的看下图 解题思路 循环嵌套 对于这道题 有很多种方法 首先想到的 应是循环嵌套 直接for循环两边寻找相同 并求得丢失的整数 代码就不展示了 想必大家都会写 但时间复杂度O n2 是相当高的 对于
  • ios html mail,在Ios上的html电子邮件中显示base64图像

    我生成一个包含base64图像的html字符串 当MFMailComposeViewController打开时 我会看到生成的电子邮件中的图像 当我发送并打开它时 图像不会显示 只有空方块 我的代码 IBAction actionShare
  • VSCode无法登录leetcode,报[ERROR] invalid password?错误

    原因 leetcode cn的用户名是手机或者邮箱 不能用昵称登录 在官网退出登陆后发现用昵称登录不了 换成邮箱或者手机号后 登录成功 login node 960 Warning Accessing non existent proper
  • SQL Server主流版本生命周期管理

    SQL Server 生命周期 每个版本的 SQL Server 都有至少 10 年的支持期限 其中包括五年的主要支持和五年的扩展支持 主要支持 包括功能 性能 可伸缩性和安全更新 扩展支持 仅包含安全更新 终止支持 有时也称为生命周期结束
  • 2020年高教社杯全国大学生数学建模竞赛赛题 C题分析与思路!(持续更新)

    C题 中小微企业的信贷决策 1 C题题目背景 分析 在实际中 由于中小微企业规模相对较小 也缺少抵押资产 因此银行通常是依据信贷政策 企业的交易票据信息和上下游企业的影响力 向实力强 供求关系稳定的企业提供贷款 并可以对信誉高 信贷风险小的
  • 【nginx编译-zierror: ‘struct crypt_data‘ has no member named ‘current_salt‘】

    nginx编译 src os unix ngx user c In function ngx libc crypt src os unix ngx user c 26 7 error struct crypt data has no mem
  • C#中Class与Struct区别

    C 中Class与Struct区别 1 class 是引用类型 继承自System Object stuce是值类型 继承自System ValueType类 因此不具多态性 但是注意 System ValueType是个引用类型 2 从职
  • 如何用SPSS对数据进行标准化处理?

    SPSS统计分析软件是我最早接触的数据分析工具 我的博客将陆续介绍SPSS统计分析软件的相关内容 这类文章将统一按照在标题或者正文第一段出现 SPSS案例分析 编号 的形式组织 便于读者朋友们快速查询 收集 今天是第一篇 即 SPSS案例分
  • python循环与文件操作

    if 语句语法结构 if 条件 elif 条件 else 1 如果表达式的值 非0 或者为布尔值 True 则代码组 if suite 被执行 否则就去执行 else suite 2 只要表达式数字为 非零值 即为 True 3 空字符串
  • 移植使用tslib 库

    目录 tslib 简介 tslib 移植 下载tslib 源码 编译tslib 源码 tslib 安装目录下的文件夹介绍 在开发板上测试tslib tslib 库函数介绍 打开触摸屏设备 配置触摸屏设备 读取触摸屏数据 基于tslib 编写