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

linux进程的复制和替换

Linux 进程的复制与替换

一、主函数参数

在 C 语言里,main 函数能够接收参数,其标准形式如下:

int main(int argc, char* argv[], char* envp[]);
  • argc:代表命令行参数的数量,为整数类型。
  • argv:是一个字符串数组,用来存放命令行参数的具体内容,argv[0] 一般是程序自身的名称。
  • envp:也是字符串数组,用于存储环境变量的信息。

二、缓冲区机制

printf 函数不会马上把数据输出到屏幕,而是先存于缓冲区。只有在满足以下三种情况时,才会输出到屏幕:

  1. 缓冲区满:当缓冲区的数据量达到上限,就会将数据输出。
  2. 强制刷新:可以使用 fflush(stdout) 函数来强制把缓冲区的数据输出。
  3. 程序结束:程序结束时,缓冲区的数据会自动输出。

三、fork 复制进程

fork 函数用于创建一个新的进程,此进程为调用 fork 的进程的子进程。fork 调用一次会返回两次:在父进程中返回子进程的进程 ID,在子进程中返回 0;若创建失败则返回 -1。
在这里插入图片描述
图片解释:左边的框图是父进程,右边的框图是子进程,两个进程的id号不同,并且不在同一块物理内存中。

#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {// 子进程printf("子进程: PID = %d, 父进程 PID = %d\n", getpid(), getppid());} else {// 父进程printf("父进程: PID = %d, 子进程 PID = %d\n", getpid(), pid);}return 0;
}

四、僵死进程与孤儿进程

僵死进程

出现原因

在 Linux 系统中,若子进程先结束而父进程还未结束,子进程就会成为僵死进程。子进程调用 exit() 退出后,其退出码会存于进程控制块(PCB)中。Linux 要求父进程必须获取子进程的退出码,在父进程获取之前,子进程的进程实体消失,但 PCB 会保留,此时子进程处于僵死状态。僵死进程不占用内存,仅消耗少量内核资源,不过过多的僵死进程会致使进程号耗尽。

解决方法

父进程可主动调用 wait()waitpid() 函数来获取子进程的退出码,从而释放子进程的 PCB。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {// 子进程printf("子进程即将退出\n");exit(0);} else {// 父进程int status;wait(&status);//阻塞if (WIFEXITED(status)) {//判断子进程是否正常退出printf("子进程正常退出,退出码: %d\n", WEXITSTATUS(status));//获取退出码}}return 0;
}

孤儿进程

若父进程先结束,子进程会被 init 进程(PID 为 1)接管,init 进程会定期调用 wait() 来清理子进程,避免出现大量僵死进程。

五、wait 函数

wait 函数用于等待子进程结束,并获取其退出状态。相关函数及宏定义如下:

#include <sys/wait.h>// 等待任意子进程结束,返回子进程的 PID,若出错则返回 -1
pid_t wait(int *status);// 判断子进程是否正常退出
int WIFEXITED(int status);// 获取正常退出的子进程的退出码
int WEXITSTATUS(int status);

六、fork 常见代码问题

有换行符的情况

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>int main() {for (int i = 0; i < 2; i++) {fork();printf("A\n");}exit(0);
}

在这里插入图片描述

初始时,主进程进入循环,i = 0。执行 fork() 后创建子进程 1,父进程和子进程 1 都从 fork() 返回,继续执行后续代码,各自打印一个 A。之后循环变量 i++ 变为 1,再次进入循环,父进程和子进程 1 又分别创建子进程 2 和子进程 3,这四个进程在第二次循环中都会打印一个 A,所以总共会打印 4 个 A

无换行符的情况

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>int main() {for (int i = 0; i < 2; i++) {fork();printf("A");}exit(0);
}

由于没有换行符,printf 的输出会存于缓冲区。fork 创建子进程时,缓冲区的内容会被复制到子进程中。因此,最终会打印 8 个 A

七、系统调用与文件操作

系统调用和库函数的关系

系统调用是用户程序访问内核的接口,只要需要访问内核的数据或硬件资源,库函数通常会调用系统调用。系统调用是访问内核的桥梁。
在这里插入图片描述

文件读写操作

open 函数
#include <fcntl.h>// 打开或创建文件
int open(const char *path, int oflags, mode_t mode);
  • path:要打开或创建的文件的路径名,可以是绝对路径或相对路径。
  • oflags:指定打开文件的方式和选项,可由多个常量按位或组合而成,如 O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(如果文件不存在,则创建它。需要在mode参数中指定新文件的权限)O_EXCL(与O_CREAT一起使用,如果文件已存在,则open调用失败。这可以用于确保创建的文件是新的,避免意外覆盖现有文件)等。
  • mode:当使用 O_CREAT 标志创建新文件时,用于指定新文件的权限位。
  • 返回值:返回一个整数类型的文件描述符,若出错则返回 -1。
write 函数
#include <unistd.h>// 向文件描述符对应的文件写入数据
ssize_t write(int fildes, const void *buf, size_t nbyte);
  • fildes:文件描述符。
  • buf:要写入的数据的缓冲区。
  • nbyte:要写入的字节数。
  • 返回值:返回实际写入的字节数,若出错则返回 -1。
read 函数
#include <unistd.h>// 从文件描述符对应的文件读取数据
ssize_t read(int fildes, void *buf, size_t nbyte);
  • fildes:文件描述符。
  • buf:用于存储读取数据的缓冲区。
  • nbyte:要读取的字节数。
  • 返回值:返回实际读取的字节数,若到达文件末尾则返回 0,若出错则返回 -1。
示例代码

在这里插入图片描述
(进阶)拷贝文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>int main(int argc, char* argv[])
{if(argc != 3){printf("argc err\n");exit(1);}char *filename = argv[1];char *newfilename = argv[2];int fdr = open(filename,O_RDONLY);int fdw = open(newfilename,O_WDONLY|O_CREAT,0600);if(fdr==-1||fdw==-1){printf("open err\n");exit(1);}int num = 0;char buff[1024] = {0};while((num=read(fdr,buff,1024))>0){write(fdw,buff,num);}close(fdr);close(fdw);exit(0);
}

思考:fdr和fdw的值分别是多少?

当进程运行的时候,系统默认打开三个文件,分别是stdin、stdout、stderr,在内核中会有一个文件表存放打开的文件(结构体数组),从0下标开始,所以fdr和fdw的值应该为3、4。
在这里插入图片描述

文件操作在 fork 下的实践

先打开文件再 fork 创建子进程

父进程打开的文件,在 fork 之后子进程也能访问。父进程和子进程共享该文件,同时操作时会共享文件偏移量。

fork 创建子进程再各自打开文件

子进程和父进程各自打开文件,它们的操作互不影响。

系统调用与库函数的区别

系统调用是操作系统提供给用户程序的接口,用于访问内核的功能;库函数是对系统调用的封装,为用户提供更方便的编程接口。系统调用通常需要陷入内核态,开销较大;库函数在用户态执行,开销相对较小。

系统调用的执行过程

写时拷贝

写时拷贝是一种推迟或免除数据拷贝的技术。传统的 fork 会直接将所有资源复制给新创建的进程,效率较低。Linux 中的 fork 使用写时拷贝技术,内核在调用 fork 时并不复制整个进程地址空间,而是让父进程和子进程在某些数据上实现共享(只读),只有在需要写入时才进行复制。

八、进程替换

进程替换用于将当前程序替换为另一个程序。通常结合 forkexec 系列函数使用。

exec 系列函数

exec 系列函数包括 execlexeclpexecleexecvexecvp 等,它们本质上都是调用 execve 实现的。

#include <unistd.h>// 带参数列表的进程替换
int execl(const char *path, const char *arg, ...);// 带参数列表且在环境变量 PATH 中查找程序的进程替换
int execlp(const char *file, const char *arg, ...);// 带参数列表和环境变量的进程替换
int execle(const char *path, const char *arg, ..., char * const envp[]);// 带参数数组的进程替换
int execv(const char *path, char *const argv[]);// 带参数数组且在环境变量 PATH 中查找程序的进程替换
int execvp(const char *file, char *const argv[]);// 系统调用的进程替换
int execve(const char *filename, char *const argv[], char *const envp[]);

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(int argc, char* argv[], char* envp[]) {printf("main pid:%d\n", getpid());// execl("/usr/bin/ps", "ps", "-f", (char*)0);  // 替换进程为 ps,参数为 ps、-f// 成功不返回,失败才返回// execlp("ps", "ps", "-f", (char*)0);  // 区别在于第一个参数不需要加路径// execle("/usr/bin/ps", "ps", "-f", (char*)0, envp);char* myargv[] = {"ps", "-f", 0};// execv("/usr/bin/ps", myargv);// execvp("ps", myargv);execve("/usr/bin/ps", myargv, envp);printf("execl err\n");exit(1);
}

九、实践:自定义 bash 解释器

bash是一个命令解释器,用户通过Bash输入命令,与操作系统交互

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <pwd.h>char* get_cmd(char buff[], char* myargv[]) {if (buff == NULL || myargv == NULL) {return NULL;}int i = 0;char* s = strtok(buff, " ");while (s != NULL) {myargv[i++] = s;s = strtok(NULL, " ");}myargv[i] = NULL;return myargv[0];
}void print_info() {int user_id = getuid();char *s = "$";if (user_id == 0) {s = "#";}struct passwd *ptr = getpwuid(user_id);if (ptr == NULL) {printf("mybash>>");fflush(stdout);return;}char hostname[128] = {0};gethostname(hostname, 128);char curr_dir[128] = {0};getcwd(curr_dir, 128);printf("\033[1;32m%s@%s\033[0m:\033[1;34m%s\033[0m%s ", ptr->pw_name, hostname, curr_dir, s);fflush(stdout);
}int main() {while (1) {print_info();char buff[128] = {0};fgets(buff, 128, stdin);buff[strlen(buff) - 1] = 0;char* myargv[10] = {0};char* cmd = get_cmd(buff, myargv);if (cmd == NULL) {continue;}if (strcmp(cmd, "exit") == 0) {break;}if (strcmp(cmd, "cd") == 0) {if (myargv[1] != NULL) {if (chdir(myargv[1]) == -1) {printf("cd err:%s\n", myargv[1]);}}continue;}pid_t pid = fork();if (pid == -1) {continue;}if (pid == 0) {execvp(cmd, myargv);printf("exec err\n");exit(1);}wait(NULL);}exit(0);
}

代码解释

下面将逐行对这段代码进行分析:

头文件部分
  • #include <stdio.h>:包含标准输入输出库,这能让程序使用像printffgets这类标准输入输出函数。
  • #include <stdlib.h>:包含标准库,其中有exit函数,可用于终止程序。
  • #include <unistd.h>:包含 Unix 标准库,其中有getuidgethostnamegetcwdchdirforkexecvp等函数。
  • #include <string.h>:包含字符串处理库,像strtokstrcmpstrlen等函数就出自该库。
  • #include <sys/wait.h>:包含系统等待相关的库,其中有wait函数,用于等待子进程结束。
  • #include <pwd.h>:包含密码文件处理库,有getpwuid函数,可根据用户 ID 获取用户信息。
get_cmd函数
  • if(buff == NULL || myargv == NULL):检查传入的参数是否为NULL,若为NULL就返回NULL
  • char* s = strtok(buff," ");:运用strtok函数把输入的字符串buff按空格分割成多个子字符串。
  • while(s != NULL):持续分割字符串,直至分割完毕。
  • myargv[i++] = s;:把分割后的子字符串依次存于myargv数组中。
  • s = strtok(NULL," ");:继续分割剩余的字符串。
  • myargv[i] = NULL;:在myargv数组末尾添加NULL,这是execvp函数的要求。
  • return myargv[0];:返回myargv数组的第一个元素,也就是命令名。
print_info函数
  • int user_id = getuid();:获取当前用户的 ID。
  • char *s = "$";:初始化命令提示符符号为$
  • if(user_id == 0):若用户 ID 为 0(也就是 root 用户),则将命令提示符符号设为#
  • struct passwd * ptr = getpwuid(user_id);:依据用户 ID 获取用户信息。
  • if(ptr == NULL):若获取用户信息失败,就输出默认的命令提示符mybash>>
  • char hostname[128] = {0};gethostname(hostname,128);:获取当前主机名。
  • char curr_dir[128] = {0};getcwd(curr_dir,128);:获取当前工作目录。
  • printf("\033[1;32m%s@%s\033[0m:\033[1;34m%s\033[0m%s ",ptr->pw_name,hostname,curr_dir,s);:输出格式化的命令提示符,包含用户名、主机名、当前工作目录和命令提示符符号。
  • fflush(stdout);:刷新标准输出缓冲区,确保命令提示符及时显示。
main函数
  • while(1):进入一个无限循环,持续等待用户输入命令。
  • print_info();:输出命令提示符。
  • char buff[128] = {0};fgets(buff,128,stdin);:从标准输入读取一行命令。
  • buff[strlen(buff)-1] = 0;:去除fgets函数读取的换行符。
  • char* myargv[10] = {0};char* cmd = get_cmd(buff,myargv);:对输入的命令进行分割,获取命令名和参数。
  • if(cmd == NULL):若命令为空,就跳过本次循环。
  • if(strcmp(cmd,"exit") == 0):若命令为exit,则跳出循环,结束程序。
  • if(strcmp(cmd,"cd") == 0):若命令为cd,则使用chdir函数更改当前工作目录,若更改失败则输出错误信息。
  • pid_t pid = fork();:创建一个子进程。
  • if(pid == -1):若创建子进程失败,就跳过本次循环。
  • if(pid == 0):若当前是子进程,就使用execvp函数执行命令,若执行失败则输出错误信息并退出子进程。
  • wait(NULL);:父进程等待子进程结束。
  • exit(0);:程序正常结束。

总的来说,这段代码实现了一个简单的 shell 程序,它能显示命令提示符,读取用户输入的命令,处理exitcd命令,并且能创建子进程来执行其他命令。

strtok 函数

strtok 用于将字符串按指定的分隔符分割成多个子字符串(标记)。首次调用时传入待分割的字符串和分隔符,后续调用传入 NULL 和分隔符,函数会继续从上次的位置分割剩余字符串。不过,由于使用了静态指针,strtok 不是线程安全的。

printf 不同打印方式
  • 颜色和样式设置printf("\033[显示方式;前景色;背景色m + 打印内容 + 结尾部分:\033[0m")
  • 清屏printf("\033[2J")
  • 重置光标printf("\033[H")

相关文章:

linux进程的复制和替换

Linux 进程的复制与替换 一、主函数参数 在 C 语言里&#xff0c;main 函数能够接收参数&#xff0c;其标准形式如下&#xff1a; int main(int argc, char* argv[], char* envp[]);argc&#xff1a;代表命令行参数的数量&#xff0c;为整数类型。argv&#xff1a;是一个字符…...

【质量管理】现代TRIZ问题识别中的功能分析——相互接触分析

在文章【质量管理】现代TRIZ中问题识别中的功能分析——组件分析-CSDN博客中我们知道了如何对产品进行组件分析&#xff0c;那么组件分析出来有什么作用呢&#xff1f;组件分析就是为了接下来相互接触分析使用的。 什么是相互接触 相互接触分析是功能分析的一部分&#xff0c;…...

一种快速计算OTA PSRR的方法(Ⅱ)

1.仿真验证 1.1仿真设置 1.1.1 Test-bench原理 1.1.2 管子参数设置 为了公平地比较性能&#xff0c;设置所有OTA 的输入晶体管M1和M2为相同的gm和偏置电流1uA。 具体晶体管宽长比设置参见5.参考资料中的论文2。 1.2仿真验证 1.2.1 CM OTA 1&#xff09;小信号参数 M1 M…...

【C++】通过红黑树封装map和set

前言&#xff1a; 通过之前的学习&#xff0c;我们已经学会了红黑树和map、set。这次我们要实现自己的map和set&#xff0c;对&#xff0c;使用红黑树进行封装&#xff01; 当然&#xff0c;红黑树内容这里就不在赘述&#xff0c;我们会复用红黑树的代码&#xff0c;所以先将…...

【Java IO流】字节输入流FileInputStream、字节输出流FileOutputStream

目录 0.前言 1.FileInputStream 1.1 概述 1.2 构造方法 1.3 成员方法 1.4 FileInputStream读取文件案例演示 2.FileOutputStream 2.1 概述 2.2 构造方法 2.3 成员方法 2.4 写入文本文件案例演示 3.FileInputStream FileOutputStream拷贝文件 0.前言 本文讲解的是…...

信息收集新利器:SSearch Chrome 插件来了

SSearch 下载地址 SSearch &#x1f623;用途 每次谷歌语法搜索时还得自己写&#xff0c;我想省事一点&#xff0c;弄了一个插件&#xff0c;先加了几个常用的语法&#xff0c;点击后会跳转到对应搜索页面&#xff0c;也可以直接在搜索框微调 后续也会加些其他语法 &#…...

【AI面试准备】AI误判案例知识库优化方案

面试题&#xff1a;建立内部知识库&#xff1a;收集AI误判案例训练领域专属模型。 在回答关于“建立内部知识库收集AI误判案例训练领域专属模型”的面试问题时&#xff0c;建议从以下结构化框架展开&#xff0c;既能体现专业性&#xff0c;又能展现解决问题的系统性和实际落地…...

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

一、前言 在之前的系列文章中&#xff0c;我们已经讨论过了MIG ip的接口内容&#xff0c;配置方式和modelsim独立仿真相关的内容&#xff0c;因此&#xff0c;本文对于之前已经讨论过的相关内容只做简单描述&#xff0c;着重介绍AXI 接口MIG使用上与普通ui接口的不同之处。感兴…...

字符和编码(python)

位数&#xff1a;英文字符使用 1 个字节表示&#xff0c;中文字符通常使用 3 个字节。示例&#xff1a;汉字 “汉” 的 UTF-8 编码是 \xE6\xB1\x89。优点&#xff1a;兼容 ASCII&#xff0c;广泛用于网络传输和文件存储。 Python 中的字符串类型 在 Python 中&#xff0c;字…...

【STM32】定时器输入捕获

STM32 定时器输入捕获功能笔记 一、什么是输入捕获&#xff08;Input Capture&#xff09; 输入捕获是利用定时器的输入通道&#xff0c;在检测到信号电平变化&#xff08;如上升沿或下降沿&#xff09;时&#xff0c;立即将当前计数器的值捕获并保存到捕获寄存器&#xff08…...

spring-ai集成langfuse

1、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…...

SALOME源码分析: ParaVis

本文分析SALOME中ParaVis模块。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。注2&#xff1a;文章内容会不定期更新。 一、核心组件 二、关键流程 三、FAQs 网络资料 SALOME Scientific visualisationPARAVIS Module - Architecture …...

Ubuntu 安装 MySQL8

在 Ubuntu 下安装 MySQL 服务&#xff0c;推荐使用 apt install 官方的 APT 仓库安装方式&#xff0c;这种方式最安全、最稳定、能自动处理依赖关系&#xff0c;也支持后续升级。不推荐在官网手动下载 .deb 包的方式。 配置 Ubuntu 服务器 1. 确认 Ubuntu 系统版本 使用如下命…...

MATLAB图像加密案例

下面是一个使用 MATLAB 编写的简单图像块置乱加密/解密程序,主要利用了函数来组织代码。 这个程序通过将图像分割成小块,然后根据一个密钥(用于随机数生成器种子)打乱这些块的顺序来实现加密。解密过程则使用相同的密钥恢复原始块顺序。 核心思想: 分块: 将图像划分为 …...

同构字符串(简单)

新建两个哈希表&#xff0c;构建s到t中的字母的映射以及t到s中的字母的映射。 class Solution {public boolean isIsomorphic(String s, String t) {Map<Character,Character> s2tnew HashMap<Character,Character>();Map<Character,Character> t2snew Hash…...

红米Note9 4G版拆开后盖操作细节

先把sim卡槽整个拔出 然后如下图做试&#xff0c;4个箭头的位置塞塑料片或者指甲插入&#xff0c;弄开&#xff0c;然后从图中右侧抠开&#xff08;左侧不行&#xff0c;有排线连着后面手机主板&#xff09; 如果不按照这种办法&#xff0c;会把后盖很多地方抠烂...

Qt通过QXlsx库文件写入到excl文件,读取excl文件

第一&#xff1a;下载QXlsx库文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt项目中引入QXlsx库&#xff0c;需要把QXlsx库文件放在项目文件夹下 第三&#xff1a;将tableview中的数据存入到excl文件 代码&#xff1a; void MainWindow…...

ESP32 在Platform Arduino平台驱动外部PSAM,进行内存管理

一&#xff0c;基本介绍 本文中主要介绍ESP32、ESP32S3系列单片机&#xff0c;基于Vscode Platform Arduino和Arduino框架下如何使用外部PSAM&#xff0c;以及必要的API调用函数进行内存分配和管理。 使用前提是开发板有外部PSRAM。 二&#xff0c;平台配置 2.1 Arduino平台 …...

【AI论文】WebThinker:赋予大型推理模型深度研究能力

摘要&#xff1a;大型推理模型&#xff08;LRMs&#xff09;&#xff0c;如OpenAI-o1和DeepSeek-R1&#xff0c;展示了令人印象深刻的长期推理能力。 然而&#xff0c;他们对静态内部知识的依赖限制了他们在复杂的知识密集型任务上的表现&#xff0c;并阻碍了他们生成需要综合各…...

Python爬虫基础总结

Python爬虫基础总结 一、爬虫概述 1.1 什么是爬虫 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动浏览万维网的程序或脚本&#xff0c;它按照一定的规则&#xff0c;自动抓取互联网上的信息并存储到本地数据库中。 1.2 爬虫工作流程 ​​URL管理器​​&#xff1…...

如何构建跨平台可复用的业务逻辑层(Web、App、小程序)

从传统的Web应用到移动端的App&#xff0c;再到近年来快速崛起的小程序&#xff0c;用户的触点变得异常分散且多样化。这种多端并存的现状一方面为企业提供了更广阔的市场机会&#xff0c;另一方面也对开发团队提出了更高的要求&#xff1a;如何在不同平台间实现高效开发、降低…...

本地大模型编程实战(32)用websocket显示大模型的流式输出

在与 LLM(大语言模型) 对话时&#xff0c;如果每次都等 LLM 处理完毕再返回给客户端&#xff0c;会显得比较卡顿&#xff0c;不友好。如何能够像主流的AI平台那样&#xff1a;可以一点一点吐出字符呢&#xff1f; 本文将模仿后端流式输出文字&#xff0c;前端一块一块的显示文字…...

MySQL数据库上篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 四月初五 笔者好久没有更新。今天来写一下MySQL数据库的内容还是老样子分为上中下三篇来写&#xff0c;话不多说咱们直接进入正题。 什么是数据库 数据库是统一管理的、长期储存在计算机内非仍、有组织的相关数据集合…...

Webug4.0靶场通关笔记13- 第22关越权修改密码

目录 第22关 越权修改密码 1.打开靶场 2.源码分析 3.越权修改密码 &#xff08;1&#xff09;获取渗透账号 &#xff08;2&#xff09;越权修改aaaaa账号的密码 &#xff08;3&#xff09;修改aaaaa用户密码渗透成功 &#xff08;4&#xff09;水平越权修改mooyuan账号…...

Python 基于 lstm,cnn 算法的网络舆情可视化系统

大家好&#xff0c;我是Python徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 &#x1f345;文末获取源码联系&#x1f345; 2025年最全的计算机软件毕…...

【免费】2007-2021年上市公司对外投资数据

2007-2021年上市公司对外投资数据 1、时间&#xff1a;2007-2021年 2、指标&#xff1a;股票代码、统计截止日期、货币编码、货币类型、投资事件类型编码、投资事件类型、报告期末投资金额总计、占报告期对外投资总额的比例(%) 3、范围&#xff1a;上市公司 4、来源&#x…...

每天学一个 Linux 命令(33):uniq

每天学一个 Linux 命令(33):uniq 命令简介 uniq 是 Linux 系统中一个非常实用的文本处理命令,全称为 “unique”。它主要用于从已排序的文本文件中检测、过滤或统计重复的行。该命令通常与 sort 命令配合使用,是 Shell 脚本编程和日常文本处理中的常用工具之一。 命令语…...

WebRtc11:SDP详解

SDP规范 会话层&#xff08;全局&#xff09;媒体层&#xff08;局部&#xff09; 会话层 会话的名称和目的会话的存活时间会话中包含多个媒体信息 SDP媒体信息 媒体格式传输协议传输IP和端口媒体负载类型 SDP格式 由多个< type > < value > 组成一个会话级…...

51单片机驱动 矩阵键盘

连接方式为8-1顺序连接P1端口P10-P17&#xff0c;代码返回键值 0-15. // 矩阵键盘扫描 uchar key_scan(void) {u8 key_value 255;u8 row, col;// 设置P1.0-P1.3为输出&#xff0c;P1.4-P1.7为输入P1 0xF0; // 1111 0000if((P1 & 0xF0) ! 0xF0) { // 有按键按下delay_m…...

解决The‘InnoDB’feature is disabled; you need MySQL built with ‘InnoDB’ to have it

出现如下语句&#xff1a;The ‘InnoDB feature is disabled; you need MySQL built with ‘InnoDB to have it working&#xff1b; 是mysql配置文件禁掉了这个选项&#xff01; 关闭mysql数据库 在mysql的安装目录中找到my.ini文件 找到skip-innodb&#xff0c;在前面加上#号…...

大模型压缩技术详解(2025最新进展)

在2025年的AI技术格局中&#xff0c;像DeepSeek这样的顶尖模型开源已成为现实。那是否存在一种可行路径&#xff0c;让企业能够使用专注于自身领域的强力AI模型&#xff0c;同时大幅降低部署成本&#xff0c;仅需一张普通的4090显卡&#xff1f;本文将深入探讨两种主流的模型压…...

第 5 篇:红黑树:工程实践中的平衡大师

上一篇我们探讨了为何有序表需要“平衡”机制来保证 O(log N) 的稳定性能。现在&#xff0c;我们要认识一位在实际工程中应用最广泛、久经考验的“平衡大师”——红黑树 (Red-Black Tree)。 如果你用过 Java 的 TreeMap​ 或 TreeSet​&#xff0c;或者 C STL 中的 map​ 或 s…...

spring-- 事务失效原因及多线程事务失效解决方案

事务失效原因 类的自调用&#xff1a;直接调用本类的方法&#xff0c;没有通过代理对象来调用方法&#xff0c;代理对象内部的事务拦截器不会拦截到这次行为。则不可能开启事务 使用私有方法&#xff1a;因为spring的事务管理是基于AOP实现的&#xff0c;AOP代理无法拦截目标对…...

MLPerf基准测试工具链定制开发指南:构建领域特异性评估指标的实践方法

引言&#xff1a;基准测试的领域适配困局 MLPerf作为机器学习性能评估的"黄金标准"&#xff0c;其通用基准集在实际科研中常面临‌领域适配鸿沟‌&#xff1a;医疗影像任务的Dice系数缺失、NLP场景的困惑度指标偏差等问题普遍存在。本文通过逆向工程MLPerf v3.1工具…...

深度理解linux系统—— 进程切换和调度

前言&#xff1a; 了解了进程的状态和进程的优先级&#xff0c;我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在&#xff0c;程序是并发执行的&#xff1b;也就是说在一段时间呢&#xff0c;进程是轮番执行的&#xff1b; 这也是说一个进程在运行时不会一直占用CPU直…...

【凑修电脑的小记录】vscode打不开

想把vscode的数据和环境从c盘移到d盘 大概操作和这篇里差不多 修改『Visual Studio Code&#xff08;VS Code&#xff09;』插件默认安装路径的方法 - 且行且思 - 博客园 在原地址保留了个指向新地址的链接文件。 重新安装vscode后双击 管理员身份运行均无法打开&#xff0…...

2025五一数学建模竞赛A题完整分析论文(共45页)(含模型、可运行代码、数据)

2025年五一数学建模竞赛A题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1参考代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 …...

从0搭建Transformer

0. 架构总览&#xff1a; 1. 位置编码模块&#xff1a; import torch import torch.nn as nn import mathclass PositonalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdrop…...

生物化学笔记:神经生物学概论07 躯体感受器 传入方式 自主神经系统

功能各异的躯体感受器 解释张力&#xff1a; 形形色色的传入方式 脑中的“倒立小人” 自主神经系统...

滑动窗口leetcode 209和76

一、leetcode 209. 长度最小的子数组 代码&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int left 0;int sum 0;int res 100001;for(int right 0;right <n;right){sum nums[right];while(s…...

FPGA:介绍几款高速ADC及其接口形式

本文介绍了几款采样率至少为500Msps的高速ADC芯片&#xff0c;并详细介绍ADC与FPGA之间的常见接口形式&#xff0c;以及FPGA如何正确读取高速ADC的输出数据。以下内容基于当前的高速ADC技术趋势和常见的工程实践。 一、推荐的高速ADC芯片&#xff08;采样率≥500Msps&#xff0…...

未使用连接池或配置不当的性能陷阱与优化实践

目录 前言一、传统连接管理的性能缺陷与风险1. 未使用连接池的致命代价2. 连接池配置不当的典型表现 二、高性能连接池选型与核心参数优化1. HikariCP&#xff1a;零开销连接池的标杆2. Druid&#xff1a;功能完备的国产连接池 三、连接池性能调优的黄金法则1. 科学设定最大连接…...

亚马逊云服务器性能深度优化方案(2025版)

亚马逊云服务器性能深度优化方案&#xff08;2025版&#xff09; 一、计算架构全面升级 1. 新一代AI算力引擎 • Trn2 UltraServer实例&#xff1a;搭载64颗第二代Trainium芯片&#xff0c;单节点FP8算力达83.2 PFlops&#xff0c;支持千亿参数大模型训练&#xff0c;训…...

【IPMV】图像处理与机器视觉:Lec9 Laplace Blending 拉普拉斯混合

【IPMV】图像处理与机器视觉 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid Lec9 Laplace Blending 持续更新中 …...

【东枫电子】AMD / Xilinx Alveo™ UL3422 加速器

AMD / Xilinx Alveo™ UL3422 加速器 AMD / Xilinx Alveo™ UL3422 加速器提供超低延迟网络和灵活应变的硬件&#xff0c;支持纳秒级交易策略。AMD Virtex™ UltraScale™ VU2P FPGA 为 AMD / Xilinx Alveo UL3422 加速器提供强大的支持。该加速器采用延迟优化的收发器技术&am…...

Linux架构篇、第一章_03安装部署nginx

Linux_基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;安装部署nginx 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.02 适用环境: Centos7 文档说明 本文档聚焦于 CentOS 7 环境下 Nginx 的安装部…...

Semantic Kernel 快速入门

文章目录 Semantic Kernel 快速入门一、什么是 Semantic Kernel&#xff1f;1.1 核心特性 二、安装和配置2.1 安装 .NET SDK2.2 创建新的 .NET 项目2.3 安装 Semantic Kernel 三、快速入门3.1 导入依赖包3.2 添加 AI 服务3.3 添加企业服务3.4 生成内核并检索服务3.5 添加插件创…...

MySQL进阶(一)

一、存储引擎 1. MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层&#xff1a; 第二层架构主要完成大多数的核心服务…...

ThreadLocal理解

1.thread是线程&#xff0c;threadLocal是对象&#xff1f; 在 Java 中&#xff1a; Thread 是线程类&#xff0c;其实例代表线程&#xff1a;Thread 类用于创建和管理线程&#xff0c;每个线程都是 Thread 类的一个实例&#xff0c;用于执行具体的任务&#xff0c;例如&…...

PyTorch、Flash-Attn、Transformers与Triton技术全景解析+环境包

PyTorch、Flash-Attn、Transformers与Triton技术全景解析 包好难找 这里是下载链接 添加链接描述 摘要 本文系统性地介绍了深度学习领域的四大关键技术框架&#xff1a;PyTorch、Flash-Attn、Hugging Face Transformers和Triton&#xff0c;分别从核心特性、技术优势、应用场…...