Linux:查询当前进程或线程的资源使用情况

news2024/11/20 1:22:22

目录

  • 一、/proc/[PID]/下的各个文件
    • 1、proc简介
    • 2、/proc/[PID]/详解
  • 二、通过Linux API获取当前进程或线程的资源使用情况
    • 1、getrusage
    • 2、sysinfo
    • 3、times

   在工作中,我们排除app出现的一些性能/资源问题时,通常要先知道当前app的资源使用情况,方能进一步思考改进措施。获取这些信息的途径有很多,我这里简单分享下两种:1)从proc文件系统;2)通过Linux 的API函数。

一、/proc/[PID]/下的各个文件

1、proc简介

  /proc 目录是一个特殊的虚拟文件系统,它提供了对内核运行时信息的访问,包括进程、设备、网络、文件系统等各个方面的信息。它不是一个真正的文件系统,而是基于内核数据结构的一个接口,通过这个接口可以获取系统的运行时状态。

下面是 /proc 目录的一些重要子目录和关键内容的说明:

  • /proc/[PID]:此目录以进程的 ID(PID)命名,并包含与该进程有关的文件和目录,如之前所讲的 /proc/pid/目录。

  • /proc/cpuinfo:该文件包含有关 CPU(处理器)的信息,如厂商、型号、频率、缓存等。

  • /proc/meminfo:该文件包含有关系统内存的信息,如总内存、可用内存、缓存、交换分区等。

  • /proc/mounts:此文件列出了系统上已挂载的文件系统,包括文件系统类型、挂载点、挂载选项等信息。

  • /proc/net:此目录包含有关网络协议、接口和连接的信息,如 /proc/net/tcp、/proc/net/udp 等文件。

  • /proc/sys:此目录包含与内核参数和系统配置相关的文件。可以通过读写这些文件来修改内核的运行时行为。

  • /proc/version:该文件包含了当前正在运行的内核版本信息。

  • /proc/cmdline:此文件包含了系统引导时传递给内核的命令行参数。

  • /proc/uptime:该文件包含自系统开机以来的运行时间和空闲时间。

  • /proc/sys/kernel/hostname:此文件包含主机的名称(hostname)。

  除了上述目录和文件,/proc 目录下还有很多其他文件和目录,涵盖了系统和进程的各个方面的信息。

  需要注意的是,/proc 目录下的文件是动态生成的,信息在进程运行时改变。读取这些文件时,请确保有足够的权限,并理解每个文件的含义和用途。此外,不要轻易对 /proc 目录下的文件进行修改,因为这可能会导致系统不稳定或损坏。

2、/proc/[PID]/详解

在这里插入图片描述

  • arch_status: 该文件包含了有关进程所运行的指令集架构的信息。例如,它可以显示进程在x86或ARM架构上运行。

  • attr: 此目录包含与进程关联的文件、目录和进程的访问控制列表(ACL)信息。这些文件和目录的访问权限可以在这里进行管理和修改。

  • autogroup: 这个文件显示了进程是否被自动控制分组,以限制对CPU资源的访问。如果进程分配给自动控制分组,则该文件中的值为"1";否则,为"0"。

  • auxv: 此文件包含了进程的辅助向量信息,这些信息在加载动态链接器时向其传递参数。辅助向量为动态链接器提供有关进程环境和运行状态的信息。

  • cgroup: 该文件显示了进程所属的控制组(cgroup)的路径。控制组是一种组织和限制进程资源使用的方式。

  • cmdline: 该文件包含了启动进程时使用的命令行参数,以null字符分隔各个参数。可以通过读取该文件来获取进程的命令行参数信息。

  • comm: 进程的命令名可以通过这个文件获得。它可以是可执行文件名或进程自描述。

  • coredump_filter:这个文件决定了进程在发生崩溃时生成核心转储(core dump)的内容。通过修改该文件的值,可以控制生成核心转储时包含的内容,这对于调试崩溃问题非常有用。可以使用 echo 命令将特定的值写入这个文件中,以修改核心转储的行为。

  • cpu_resctrl_groups:这个文件是与 CPU 资源控制(Resource Control)相关的,用于管理进程对CPU资源的使用。通过这个文件,可以查询或配置进程关联的 CPU ResCtrl(CPU资源控制)组的信息。CPU资源控制是用于管理和限制进程对CPU资源的访问的一种技术,可以实现资源隔离、分配和监控。

  • cwd: 这是一个符号链接,指向进程的当前工作目录(current working directory)。

  • environ: 该文件包含了进程的环境变量,以null字符分隔各个环境变量。通过读取该文件,可以获取进程的环境变量信息。

  • cpuset: 这个文件包含了进程所属的 cpuset(CPU affinity)的信息,可以用于管理进程所能使用的 CPU 核心。 通过这个文件,可以查询或设置进程所在的 cpuset。

  • exe:这是一个符号链接,指向进程正在执行的可执行文件。通过读取这个符号链接,可以获取进程当前正在执行的可执行文件的路径。

  • fdinfo: 这个目录包含了关于进程打开的文件描述符(file descriptor)的详细信息,如文件的偏移量(offset)等。

  • gid_map:这个文件用于表示进程的实际组ID(GID)与其用户命名空间中的GID之间的映射关系。

  • io:这个文件包含了有关进程的输入/输出统计信息,如读取和写入的字节数、I/O操作次数等。

  • limits:这个文件包含了对进程资源限制的报告,显示了一些限制项目的值,比如内存限制、文件大小限制等。

  • loginuid:这个文件记录了与进程关联的登录用户ID(login UID)。

  • map_files:这个目录包含了进程打开的映射文件的相关信息,可以用于查询进程当前使用的文件映射情况。

  • fd: 此目录包含了进程打开的文件描述符(file descriptor)的符号链接。可以通过查看这些符号链接来获取进程打开的文件等信息。

  • maps: 该文件包含有关进程内存映射的信息,包括进程的内存地址范围、映射的文件等。

  • mounts: 此文件显示了进程的挂载点信息,包括进程当前挂载的各个文件系统的详细数据。

  • mem:这个文件允许对进程的内存空间进行直接访问,可以用于调试、内存分析等目的。

  • mountinfo:这个文件提供了有关进程所挂载的文件系统的详细信息,包括挂载点、挂载选项等。

  • mountstats: 此文件包含了有关挂载点的统计信息,如 I/O 统计等。

  • net:目录包含了一系列与网络相关的文件和子目录,可以用于查询进程的网络连接、端口等信息。

  • ns:这个目录包含了进程的各种命名空间相关的符号链接,可以用于查询和操作进程的命名空间。

  • numa_maps:这个文件包含了有关进程内存使用和NUMA节点分布情况的信息,对于了解进程的NUMA相关性非常有用。

  • oom_adj:这个文件包含了与进程的OOM(Out Of Memory)分级相关的信息,用于调整进程在内存不足情况下被系统杀死的优先级。

  • oom_score:这个文件包含了进程的OOM分数,用于在系统内存不足时选择性地终止进程。

  • oom_score_adj:与 oom_adj 类似,这个文件也用于调整进程在内存不足情况下被系统杀死的优先级。

  • pagemap:这个文件提供了有关进程虚拟内存页面到物理内存帧的映射信息,对于内存管理方面的深入了解非常有用。

  • patch_state:这个文件包含了有关进程的内核安全补丁状态的信息,通常用于安全审计和补丁管理。

  • personality: 这个文件包含了与进程的运行环境和虚拟机架构相关的信息,用于指定进程的特定行为。

  • projid_map:在用户命名空间中使用的文件,用于表示进程实际项目ID(Project ID)与其用户命名空间中的项目ID之间的映射关系。

  • root:这是一个符号链接,指向进程的根目录。

  • sched:这个文件提供了与进程调度策略和优先级相关的信息,包括当前调度策略、优先级等。

  • schedstat:这个文件包含了与进程调度统计相关的信息,如运行时间、等待时间等。

  • sessionid:这个文件记录了与进程关联的会话ID。

  • setgroups:这个文件包含了与进程的附加组(supplementary group)相关的信息。

  • smaps:这个文件提供了详细的进程内存映射信息,包括每个内存区域的权限、大小、映射文件等。

  • smaps_rollup: 类似于 smaps 文件,但提供了按文件和库合并的内存映射信息,用于更简洁的内存分析。

  • stack:这个文件记录了进程的当前栈的内容。

  • stat: 这个文件提供了与进程状态相关的信息,如进程ID、父进程ID、运行状态等。

  • statm:这个文件提供了与进程内存使用量相关的信息,包括进程的总内存、共享内存、库内存、堆内存等。

  • status:这个文件提供了有关进程的多种信息,包括进程状态、内存使用、文件描述符等。

  • syscall:这个目录包含与进程相关的系统调用信息,可以用于跟踪和分析进程的系统调用。

  • task:这个目录包含了进程的所有线程(task)的信息。

  • timens_offsets:这个文件提供了与进程关联的时间命名空间偏移量的信息,用于跟踪进程的时间命名空间变化。

  • timers:这个目录包含了与进程相关的定时器的信息,如定时器ID、时间值等。

  • timerslack_ns:这个文件包含了与进程的定时器松弛值(timerslack)有关的信息,用于调整进程的定时行为。

  • uid_map:这个文件用于表示进程的实际用户ID(UID)与其用户命名空间中的UID之间的映射关系。

  • wchan:是一个用于描绘一个进程在等待什么的内核函数指针。它表示了进程当前正在等待的内核函数或系统调用。可用于调试和分析进程的等待状态。

   这些文件和目录提供了关于特定进程的多种信息,如进程状态、资源使用情况、环境变量等,通常被用于性能调优、调试以及资源管理方面,对于普通用户来说可能并不经常需要直接操作这些文件。通过读取这些文件,可以了解并监视系统中各个进程的情况。请注意,有些文件是符号链接,需要使用readlinkls -l等命令来获取其指向的真实路径。

知识补充:
   命名空间(Namespace)在Linux系统中是一种用于隔离系统资源的机制。它允许在同一台物理机上创建多个隔离的环境,每个环境可以拥有自己独立的资源实例,例如进程ID、挂载点、网络、用户等。这种隔离使得不同的进程能够在同一系统上运行,而彼此之间互不干扰。

在Linux中,有多种类型的命名空间,包括但不限于以下几种:

  1. PID 命名空间(PID Namespace):使得进程拥有自己独立的进程ID空间,进程在不同的PID命名空间中可以拥有相同的PID而不会相互影响。

  2. 挂载命名空间(Mount Namespace):使得进程拥有独立的文件系统挂载点,不同的挂载命名空间中可以有不同的文件系统视图。

  3. 网络命名空间(Network Namespace):允许每个命名空间中拥有独立的网络设备、IP地址等网络资源,实现网络隔离。

  4. IPC 命名空间(IPC Namespace):用于隔离进程间通信资源,如消息队列和共享内存等。

  5. UTS 命名空间(UTS Namespace):用于隔离系统标识,如主机名等。

  6. 用户命名空间(User Namespace):允许分配不同的用户和组ID给进程,从而实现用户隔离。

   通过使用命名空间,容器技术得以实现,并且不同的容器可以在相互隔离的环境中运行,从而实现更高效的资源利用和更好的安全性。

二、通过Linux API获取当前进程或线程的资源使用情况

  要获取当前进程或线程的资源使用情况,可以使用Linux提供的一些系统调用或API。以下是一些常用的方法:

1、getrusage

   getrusage 是一个用于获取进程或线程的资源使用情况的系统调用函数,在 Linux 系统中的头文件 <sys/resource.h> 中定义。

#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

参数who用于指定获取资源使用情况的对象,包括以下两个选项:

  • RUSAGE_SELF: 获取当前进程的资源使用情况。
  • RUSAGE_CHILDREN: 获取当前进程创建的所有子进程的资源使用情况的汇总信息。

参数 usage 是一个指向 struct rusage 结构体的指针,用于存储获取到的资源使用情况信息。

//struct rusage 结构体包含了一系列字段,用于表示不同类型的资源使用情况
struct rusage {
    struct timeval ru_utime; /* user CPU time used */
    struct timeval ru_stime; /* system CPU time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims (soft page faults) */
    long   ru_majflt;        /* page faults (hard page faults) */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* IPC messages sent */
    long   ru_msgrcv;        /* IPC messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};
  • ru_utime:用户级别的 CPU 时间(执行用户程序的时间)。
  • ru_stime:系统级别的 CPU 时间(执行系统调用的时间)。
  • ru_maxrss:进程最大的常驻内存大小(以 KB 为单位)。
  • ru_ixrss:进程的共享内存大小。
  • ru_idrss:进程的非共享数据段的大小。
  • ru_isrss:进程的栈大小。
  • ru_minflt:产生的次缺页错误(对不存在的内存页面发生的访问,需要从硬盘加载)。
  • ru_majflt:产生的主缺页错误(必须从硬盘加载数据)。
  • ru_nswap:发生的交换次数(从内存到磁盘或反之)。
  • ru_inblock:从块设备读取的次数。
  • ru_oublock:向块设备写入的次数。
  • ru_msgsnd:发送的消息数。
  • ru_msgrcv:接收的消息数。
  • ru_nsignals:发出的信号数。
  • ru_nvcsw:从等待状态唤醒的上下文切换次数(通过虚拟终端 I/O、文件系统路径名查找、等待 CPU 时间等方式)。
  • ru_nivcsw:无法满足进程需求而导致的上下文切换次数。

   这些资源使用情况信息对于进程性能分析和系统监控非常有用。getrusage 函数返回的资源使用情况是关于当前进程或线程的信息。要获取其他进程的资源使用情况,需要使用相应的进程相关的系统调用(如 wait4),并将返回的 rusage 结构体作为参数传递给 wait4

   wait4 是一个用于等待子进程结束并获取其状态信息的系统调用函数。在 Linux 系统中的头文件 <sys/wait.h> 中定义。wait4 函数的原型为:

pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);

其中参数含义如下:

  • pid:指定要等待的子进程的 ID。传入 -1 表示等待任意子进程结束。
  • status:用于获取子进程的退出状态信息。
  • options:用于指定等待的选项,包括一些控制子进程状态获取行为的选项。
  • rusage:用于获取子进程的资源使用情况信息,即上一条回答中提到的 struct rusage 结构体。

   wait4 函数会阻塞父进程,直到指定的子进程结束。当子进程结束后,父进程将获得子进程的退出状态信息存储在 status 中,并且如果传入了 rusage 参数,则会获取子进程的资源使用情况信息。

   通常情况下,wait4 函数与 fork 函数结合使用,父进程通过 fork 创建子进程,然后通过 wait4 等待子进程结束,并获取其状态信息。这样可以实现父子进程之间的同步和协作。

#include <sys/resource.h>

int main() {
    struct rusage usage;

    getrusage(RUSAGE_SELF, &usage);

    // 打印CPU时间
    printf("CPU时间: %ld.%06ld 秒\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);

    // 打印最大使用的内存
    printf("最大内存使用量: %ld 字节\n", usage.ru_maxrss);

    // 其他资源使用情况,可以在usage结构体中查看
    // ...

    return 0;
}

2、sysinfo

  sysinfo 是一个用于获取系统信息的系统调用函数,在 Linux 系统中的头文件 <sys/sysinfo.h> 中定义。函数原型如下:

int sysinfo(struct sysinfo *info);

参数 info 是一个指向 struct sysinfo 结构体的指针,用于存储获取到的系统信息。

//Since Linux 2.3.23 (i386) and Linux 2.3.48 (all architectures) the structure is:
struct sysinfo {
    long uptime;             /* Seconds since boot */
    unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
    unsigned long totalram;  /* Total usable main memory size */
    unsigned long freeram;   /* Available memory size */
    unsigned long sharedram; /* Amount of shared memory */
    unsigned long bufferram; /* Memory used by buffers */
    unsigned long totalswap; /* Total swap space size */
    unsigned long freeswap;  /* Swap space still available */
    unsigned short procs;    /* Number of current processes */
    unsigned long totalhigh; /* Total high memory size */
    unsigned long freehigh;  /* Available high memory size */
    unsigned int mem_unit;   /* Memory unit size in bytes */
    char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding to 64 bytes */
};
  • long uptime:系统已经运行的时间(以秒为单位)。
  • unsigned long loads[3]:系统的平均负载值,分别代表过去1分钟、5分钟和15分钟的平均负载。这些值是无符号长整型数,表示了负载值乘以 2^16 的结果。
  • unsigned long totalram:系统总共的物理内存大小(以字节为单位)。
  • unsigned long freeram:系统可用的物理内存大小(以字节为单位)。
  • unsigned long sharedram:被共享的物理内存大小(以字节为单位)。
  • unsigned long bufferram:被用作缓冲区的物理内存大小(以字节为单位)。
  • unsigned long totalswap:交换空间的总大小(以字节为单位)。
  • unsigned long freeswap:可用的交换空间大小(以字节为单位)。
  • unsigned short procs:当前进程数量。
  • unsigned long totalhigh:可用的高位内存大小(以字节为单位)。
  • unsigned long freehigh:空闲的高位内存大小(以字节为单位)。
  • unsigned int mem_unit:内存单元大小(以字节为单位)。

sysinfo 函数的返回值为 0 表示成功,-1 表示失败,并且可以通过 errno 来获取具体错误信息。

#include <sys/sysinfo.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    struct sysinfo info;

    sysinfo(&info);

    // 打印总内存大小
    printf("总内存大小: %ld 字节\n", info.totalram * info.mem_unit);

    // 打印已使用内存大小
    printf("已使用内存大小: %ld 字节\n", (info.totalram - info.freeram) * info.mem_unit);

    // 其他资源使用情况,可以在info结构体中查看
    // ...

    return 0;
}

struct sysinfo 结构体中,loads 数组中的数值表示了负载值乘以 2^16 的结果,这是因为 sysinfo 结构体中的 loads 数组使用了 unsigned long 类型。

在 Linux 内核中,负载值是以固定点数的格式表示的,使用了定点数表示方式来保留小数部分。在这里,每个负载值都被乘以了 2^16(65536),以便将小数部分转换为整数。

这种表示方式的好处在于,它可以比较精确地表示系统的负载情况,同时又不需要使用浮点数来表示,因为浮点数的运算会耗费相对更多的 CPU 时间。通过将负载值乘以一个固定的倍数(2^16),可以在不牺牲太多精度的情况下,使用整数进行表示和计算,这样会更高效。

当我们从 struct sysinfo 结构体中获取负载值时,需要将其除以 2^16 来得到真实的负载值。例如,在上面的示例代码中,打印负载值时并没有除以 2^16,因此实际的负载值应当是 info.loads[x] / 65536 才能得到系统的实际负载情况。

总之,通过将负载值乘以 2^16 来表示,Linux 内核可以在保持较高精度的同时,使用更高效的整数表示方式,用于存储和计算系统的负载情况。

3、times

times 函数是一个用于获取进程和子进程的系统和用户 CPU 时间的系统调用,其原型如下:

#include <sys/times.h>

clock_t times(struct tms *buf);
  • buf 是一个指向 tms 结构的指针,它用来存储 CPU 时间的信息。

struct tms 结构包含了进程和子进程的 CPU 时间信息,其定义如下:

struct tms {
    clock_t tms_utime;  // 进程在用户态花费的时间
    clock_t tms_stime;  // 进程在内核态花费的时间
    clock_t tms_cutime; // 所有已终止子进程在用户态花费的时间
    clock_t tms_cstime; // 所有已终止子进程在内核态花费的时间
};
  • tms_utime 表示进程在用户态花费的 CPU 时间。
  • tms_stime 表示进程在内核态花费的 CPU 时间。
  • tms_cutime 表示所有已终止子进程在用户态花费的 CPU 时间。
  • tms_cstime 表示所有已终止子进程在内核态花费的 CPU 时间。

示例代码如下所示,演示了如何使用 times 函数来获取进程的 CPU 时间信息:

#include <stdio.h>
#include <sys/times.h>
#include <time.h>
#include <unistd.h>

int main() {
    struct tms tms_buf;
    clock_t start, end;

    // 获取起始时间
    start = times(&tms_buf);
    printf("Starting time: %ld\n", start);

    // 模拟一些工作
    for (int i = 0; i < 100000000; ++i) {
        // do something
    }

    // 获取结束时间
    end = times(&tms_buf);
    printf("Ending time: %ld\n", end);

    // 计算 CPU 时间消耗
    clock_t user_time = tms_buf.tms_utime;
    clock_t sys_time = tms_buf.tms_stime;
    printf("User CPU time: %ld\n", user_time);
    printf("System CPU time: %ld\n", sys_time);

    return 0;
}

  这个示例代码中,我们首先调用 times 函数获取了进程的 CPU 时间信息,并输出了起始时间。然后进行了一些模拟工作,之后再次调用 times 函数获取了结束时间,最后计算了用户态和内核态的 CPU 时间消耗。

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

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

相关文章

一种改进的平衡生成对抗网络用于视网膜血管分割

A Refined Equilibrium Generative Adversarial Network for Retinal Vessel Segmentation 一种改进的平衡生成对抗网络用于视网膜血管分割背景贡献实验方法Symmetric equilibrium architecture&#xff08;对称均衡架构&#xff09;Multi-scale features refine block&#xf…

40G多模光模块QSFP-40G-SR4优势及应用领域介绍

QSFP-40G-SR4光模块是一种常用的光纤传输解决方案。传输速率40G&#xff0c;SR代表短距离多模光纤&#xff08;Short Range Multimode Fiber&#xff09;&#xff0c;4表示有四个光纤通道。这种光模块采用MPO/MTP多模光纤连接器来实现高速传输&#xff0c;传输距离可以达到300米…

如何将语音版大模型AI接入自己的项目里(语音ChatGPT)

如何将语音版大模型AI接入自己的项目里语音ChatGPT 一、语音版大模型AI二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、语音版大模型AI 基于阿里通义千问、百…

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印

文章目录 前言相关文章Nlog配置HandyControl配置简单使用显示效果文本内容 前言 我将简单的HandyControl的消息打印系统和Nlog搭配使用&#xff0c;简化我们的代码书写 相关文章 .NET 控制台NLog 使用 WPF-UI HandyControl 控件简单实战 C#更改控制台文字输出颜色 Nlog配置 …

Python中的用户交互函数详解,提升用户体验!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python中的用户交互函数详解&#xff0c;提升用户体验&#xff01;全文4200字&#xff0c;阅读大约12分钟 用户进行交互的Python应用程序&#xff0c;有许多常用的用户交互函…

linux开放tomcat 8080端口

1、查看8080是否开放 firewall-cmd --query-port8080/tcp查看已开启的端口 firewall-cmd --list-ports开启防火墙 systemctl start firewalld2、永久开放8080端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent3、重加载&#xff08;重启防火墙&#xff09; …

设计模式-依赖注入模式

设计模式专栏 模式介绍模式特点应用场景依赖注入和控制反转的区别代码示例Java实现依赖注入模式Python实现依赖注入模式 依赖注入模式在spring中的应用 模式介绍 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种面向对象编程中的设计模式&…

基于SSM的教育管理系统

基于SSM的教育管理系统 一、系统介绍二、功能展示1.项目内容2.项目骨架3.管理员登录4.系统界面5.注册6.系统管理7.课程管理8.添加科目9.学员信息 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于ssm的教育管理系统 当前版本&#xff1a;V1.0.0版本…

android——自定义TextView

效果展示&#xff1a; 代码解析&#xff1a; 1、首先设置自定义属性&#xff08;res/values下新建一个attrs.xml文件&#xff09; <?xml version"1.0" encoding"utf-8"?> <resources><!-- name 自定义view的名字 CustomTextView--&…

flask文件夹列表改进版--Bug追踪

把当前文件夹下的所有文件夹和文件列出来&#xff0c;允许点击返回上层目录&#xff0c;允许点击文件夹进入下级目录并显示此文件夹内容 允许点击文件进行下载 from flask import Flask, render_template, send_file, request, redirect, url_for import osapp Flask(__name_…

51单片机(STC8)-- 串口配置及串口重定向(printf)

文章目录 STC8串口概述串口寄存器配置串口1控制寄存器SCON串口1数据寄存器SBUF串口1模式 1工作方式串口1波特率计算方式 串口注意事项串口1通信demo串口重定向 STC8串口概述 由下图可知STC8H3K64S4带有4个4个串行通信接口&#xff0c;芯片名后两位S所带的数字即代表这款芯片带…

Systemctl | 系统服务管理利器

功能介绍 systemctl 是用于管理系统服务的命令行工具&#xff0c;常用于 Linux 系统中。提供了对系统服务&#xff08;包括启动、停止、重启、启用、禁用等&#xff09;的控制&#xff0c;以及对系统单元&#xff08;units&#xff09;的操作。 语法结构 systemctl 的基本语…

burpsuite的安装与介绍

安装(挑一个你喜欢的版本安装就行) 编程环境安装指南:Java、Python 和 Burp Suite抓包工具_burpsuite和java-CSDN博客 简介 Burp Suite是一个用于攻击Web应用程序的集成平台。它集成了多种渗透测试组件,能够帮助我们更好地完成对Web应用的渗透测试和攻击,无论是自动化还…

记一次Mac端mysql重置密码

在执行mysql命令的时候&#xff0c;报如下的错误&#xff0c;表示不支持mysql命令&#xff1a; zsh: command not found: mysql 1. 先查看mysql服务是否存在 在系统偏好设置中查看&#xff1a; 2. 发现mysql服务已经在运行&#xff0c;可能因为/usr/local/bin目录下缺失mysq…

信号处理设计模式

问题 如何编写信号安全的应用程序&#xff1f; Linux 应用程序安全性讨论 场景一&#xff1a;不需要处理信号 应用程序实现单一功能&#xff0c;不需要关注信号 如&#xff1a;数据处理程序&#xff0c;文件加密程序&#xff0c;科学计算程序 场景二&#xff1a;需要处理信…

Xshell连接不上本地虚拟机中的linux处理

0、连接不上虚拟机的原因 1、本地电脑未启用VMware网络。 2、连接协议选择错误。 3、防火墙屏蔽IP。 4、虚拟机网络连接模式不是桥接模式。 1、查看本地是否启用VMware的网络 2、连接协议选择 我们在新建会话时&#xff0c;可选的协议有FTP和SFTP两种&#xff0c;其中FTP采用21…

uniapp 手持弹幕全端实现(微信/QQ小程序 + APP)

见下述效果图,本文话少纯干货 代码实现 <template><view class="main"

【RocketMQ笔记02】安装RocketMQ可视化工具rocketmq-dashboard

这篇文章&#xff0c;主要介绍如何安装RocketMQ可视化工具rocketmq-dashboard。 目录 一、RocketMQ可视化界面 1.1、下载rocketmq-dashboard 1.2、修改配置文件 1.3、打包工程 1.4、启动rocketmq-dashboard 一、RocketMQ可视化界面 1.1、下载rocketmq-dashboard rocketm…

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …

汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点

汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点 RFID(射频识别技术)是非接触式自动识别技术&#xff0c;经常被使用于工业制造、物流管理、仓储物品盘点等领域。我们聊一聊在汽车零配件装配产线中使用和不使用RFID技术的优缺点 在汽车零配件装配线使用RFID技术可以…