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

Linux系统编程之进程

目录

1、进程关键概念

1.什么是程序,什么是进程,有什么区别

2.如何查看系统中有那些进程

3.什么是进程标识符

4.什么叫父进程,什么叫子进程

5.C语言的存储空间是如何分配的

2、进程创建

1.fork函数创建进程

2.vfork函数创建进程

3、进程退出

1.正常退出

2.异常退出

3.退出状态

4、等待子进程

1.wait函数

2.waitpid函数

3.孤儿进程

5、exec族函数

1.exec族函数的作用

2.exec族函数

3.代码说明

4.补充说明

1.perror函数 

2.whereis命令

 3.pwd命令

4.date命令

5.echo $PATH

6.export PATH=$PATH:......

6、system函数

1.system函数的作用

2.示例 :

7、popen函数

1.函数的作用

2.函数的具体运用

 3.示例:

1、进程关键概念

1.什么是程序,什么是进程,有什么区别

程序是静态的概念比如我们平时使用的qq、微信等都是程序,进程是程序的一次运行活动。一般来说我们的程序跑起来了,系统中就会相应的产生一个或多个进程

2.如何查看系统中有那些进程

1.使用ps指令查看

在实际应用中通常配合grep来查看程序中是否存在某一个进程

例:ps -aux|grep a 这里就会列举出含a的进程grep起到了过滤作用

2.使用top指令查看,top指令类似于Windows里的任务管理器

3.什么是进程标识符

每一个进程都有一个非负整数表示的唯一id,叫做pid,类似于我们的身份证

pid=0;称为交换进程(swapper)作用:进程调度

pid= 1;initial进程,作用:系统初始化

编程调用getpid函数获取自身的进程标识符,getppid是获取父进程的进程表示符

4.什么叫父进程,什么叫子进程

进程a创建了进程b,那么a进程就是父进程b进程就是子进程,父子进程是相对的概念

5.C语言的存储空间是如何分配的

  1. 代码区(Text Segment):

    • 存储程序的机器代码,即编译后的可执行文件。
    • 通常是只读的,防止程序意外修改自身的指令。
    • 包含函数的二进制表示。
  2. 数据区(Data Segment):

    • 存储全局变量、静态变量和常量。
    • 包括已初始化数据区(Initialized Data Segment)和未初始化数据区(BSS段)。
    • 已初始化数据区存储已经明确赋值的全局变量、静态变量和常量。
    • 未初始化数据区存储未被明确赋值的全局变量和静态变量,这部分数据在程序运行前会被初始化为零。
  3. 堆区(Heap):

    • 用于动态内存分配,例如通过 malloccallocrealloc 等函数分配的内存。
    • 堆的大小和位置可以在运行时动态改变。
    • 需要程序员手动管理分配和释放内存,否则可能导致内存泄漏或悬挂指针等问题。
  4. 栈区(Stack):

    • 用于存储函数的局部变量、函数参数、返回地址和函数调用的上下文信息。
    • 每个函数调用都会在栈上分配一块内存,该块在函数返回时会被释放。
    • 栈是一个后进先出(LIFO)的数据结构,通过栈指针(Stack Pointer)来管理。

2、进程创建

父进程与子进程是交替运行的,谁先谁后是由进程调度决定的,在 fork 之后,父进程和子进程会共享相同的代码段、数据段和堆,但各自有独立的栈。当父进程或者子进程需要修改某一处时,系统就会为子进程分配相应的空间(写拷贝)

1.fork函数创建进程

pid_t fork(void);

返回值:

1.返回正数,当前运行的是父进程,返回值就是子进程的pid

2.返回负数,表示调用失败

3.返回0,当前运行的是子进程

2.vfork函数创建进程

pid_t vfork(void);

fork与vfork的区别

1.vfork 直接使用父进程存储空间,不拷贝。

2.vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。

 创建子进程的一般目的:一个父进程希望复制自己,使父子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,创建一个子进程来处理此请求,父进程则继续等待下一个服务请求到达。还有就是一个进程需要执行一个不同的程序时。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main() {// 获取当前进程的PID(进程ID)int pid = getpid();printf("pid = %d\n", pid);// 创建子进程int fork_pid = fork();// 根据fork的返回值判断当前是父进程还是子进程if (fork_pid > 0) {// 父进程while (1) {// 打印父进程和子进程的PIDprintf("pid = %d fork_pid = %d \n", pid, fork_pid);sleep(3); // 休眠3秒}} else if (fork_pid == 0) {// 子进程while (1) {// 打印子进程的PID(子进程内通过getpid获取)// 注意:这里的fork_pid是0,因为在子进程中fork返回0printf("pid = %d fork_pid = %d \n", getpid(), fork_pid);sleep(3); // 休眠3秒}}return 0;
}

3、进程退出

1.正常退出

1.main函数调用return

2.进程调用exit(),标准c库

3.进程调用_exit()或者_Exit(),属于系统调用

补充:进程最后一个线程返回,最后一个线程调用pthread_exit

exit()是对系统调用的封装,调用时会对进程运行产生的缓冲区的内容进行处理再退出,而_exit()是直接退出不处理

2.异常退出

1.调用abort函数使进程异常退出

2.当进程收到某些信号时,如ctrl+c

3.最后一个线程对取消(cancellation)请求做出响应

3.退出状态

不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等。一般来说我们都希望终止的进程能够通知父进程它是如何终止的。对于三个终止函数(exit、_exit、_Exit),实现这一点的方法是,将其退出状态作为参数传递给函数。在异常终止情况下,内核(不是进程本身)产生一个指示其异常终止原因的终止状态。在任意一种情况下,该终止进程的父进程都能通过wait或waitpid函数取得其终止状态。

4、等待子进程

父进程等待子进程退出,并收集进程的退出状态

若是子进程退出状态不被收集,就会变成僵尸进程

1.wait函数

pid_t wait(int *status);阻塞等待

参数:

非空:子进程退出状态放在它所指的地址中

空:不关心退出状态

#include <stdio.h>
#include <stdlib.h>int main()
{int con = 0;int pid1 = getpid();int fork_pid = fork();int pid2 = getpid();int status;if(pid1 == pid2){wait(&status);printf("%d\n",status);printf("status = %d\n",WEXITSTATUS(status));while(1){printf("pid1 = %d , pid2 = %d , fork_pid = %d \n",pid1,pid2,fork_pid);sleep(1);}}else if(pid1 != pid2){while(1){printf("pid1 = %d , pid2 = %d , fork_pid = %d \n",pid1,pid2,fork_pid);con++;sleep(1);if(con == 5){exit(33);}}}return 0;
}

2.waitpid函数

pid_t waitpid(pid_t pid, int *status, int options);可以设置成不阻塞等待,但是还是会存在僵尸进程

参数一:

pid==-1 等待任一子进程。就这方面而言,waitpid与wait等效

pid>0等待其进程ID与pid相等的子进程

pid==0等待其组ID等于调用进程组id的任一子进程

pid<-1等待其组ID等于pid绝对值的任一子进程

3.孤儿进程

父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程,Linux避免系统存在过多孤儿进程,init进程会收留孤儿进程,变成孤儿进程的父进程。 

5、exec族函数

1.exec族函数的作用

我们在用fork函数创建子进程后,经常会在新进程中调用exec族函数去执行另外一个程序。当调用exec族函数时,该进程会完全替换为一个新的程序。但是由于exec族函数不会创建新的进程,所以进程的pid并没有改变

当调用 exec 函数时,当前进程的代码、数据和堆栈都被新程序的代码、数据和堆栈所替代。因此,exec 函数族在当前进程的上下文中加载新的程序,而不是创建一个全新的进程。这是 exec 函数族与 fork 函数(用于创建新进程)不同的地方。

2.exec族函数

int execl(const char *path, const char *arg, ...);
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[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

返回值:

exec族函数的函数执行成功后不会返回,调用失败时,会设置errno(失败码)并返回-1,然后从原程序的调用点接着往下执行

设置的errno(失败码)可以通过perror()函数来打印函数失败的原因

参数说明:
path:可执行文件的路径
arg:可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束
file:如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。

exec族函数参数极难记忆和分辨,函数名中的字符会给我们一些帮助:
l : 使用参数列表
p:使用文件名,并从PATH环境进行寻找可执行文件
v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量

3.代码说明

execl的使用

#include <stdio.h>
#include <unistd.h>
int main()
{while(1){int pid = fork();if(pid == 0){printf("子进程\n");execl("./zombie01","./zombie01",NULL);}else if(pid > 0){sleep(1);printf("父进程\n");}else{printf("fork no !!!\n");perror("fork");}}return 0;
}

 与下面的execlp做对比

#include <stdio.h>
#include <unistd.h>
int main()
{int dis = execl("/bin/ps","ps",NULL);if(dis == -1){printf("no no no !!!\n");perror("why");}
}

execlp的使用

#include <stdio.h>
#include <unistd.h>
int main()
{printf("exec init \n");if(execlp("ps","ps",NULL)==-1){printf("exec  = -1\n");}return 0;
}

execv的使用

#include <stdio.h>
#include <unistd.h>
int main()
{char *argv[] = {"ls","-l"};if(execv("/bin/ls",argv)==-1){printf("execv no\n");perror("execv");}return 0;
}

4.补充说明

1.perror函数 

perror 函数是一个 C 标准库中的函数,用于将与当前 errno 值相关联的错误消息输出到标准错误流(stderr)

函数原型

void perror(const char *s);

s: 一个字符串,用于在输出错误消息之前打印。通常是程序名或者与错误相关的描述性信息。

perror 会根据 errno 的值输出相应的错误消息。通常在执行系统调用或库函数失败时,errno 会被设置为指示错误的特定代码。

2.whereis命令

whereis命令行工具

用于定位程序的可执行文件、源代码和帮助文档

选项:

  • -b: 查找可执行文件。
  • -m: 查找帮助手册。
  • -s: 指定路径前缀

例如whereis ls

将返回与 ls 相关的信息,包括可执行文件、源代码文件和帮助文档的路径。

注意,whereis 通常用于系统管理员或高级用户,它在不同的系统中可能有不同的行为。在某些系统上,它可能无法找到所有文件,因为它依赖于系统数据库。另外,如果你只想查找可执行文件的位置,你可能更喜欢使用 which 命令

 3.pwd命令

显示当前工作目录的路径

4.date命令

获取当前系统时间

5.echo $PATH

输出系统中设置的 PATH 环境变量的值

6.export PATH=$PATH:......

修改环境变量PATH里的值,$PATH只是表示原先的环境变量,路径之间用':'号隔开后面是需要添加的环境变量

6、system函数

1.system函数的作用

system函数,用于在一个新的进程中执行命令。这个函数会调用系统的 shell 来执行指定的命令。system函数会自己创建一个进程来执行可执行文件或命令,当运行完之后再运行父进程

大致的流程如下:

  1. system 函数调用 fork 来创建一个新的子进程。
  2. 在子进程中,调用 exec 函数来执行指定的命令。
  3. 父进程等待子进程的完成,并获取子进程的退出状态。

函数原型

int system(const char *command);
参数command: 要执行的命令字符串

返回值

  • 如果命令成功执行,system返回一个表示退出状态的值。
  • 如果调用系统 shell 失败或命令无法执行,则返回 -1。

2.示例 :

#include <stdio.h>
#include <unistd.h>
int main()
{printf("exec init \n");if(system("ps")==-1){printf("exec  = -1\n");perror("system");}return 0;
}

在上述例子中,system("ps") 将调用系统的 shell 来执行 "ps" 命令。system函数会等待命令执行完成,然后返回命令的退出状态。如果调用失败,返回 -1。

需要注意的是,system函数的使用可能存在安全风险,特别是在处理用户输入时。如果你需要更加精细的控制和错误处理,可能需要使用更底层的函数,比如 forkexec 组合。

这里可以看一下system的源码

system()函数功能强大,我们直接看linux版system函数的源码:
代码:#include
#include
#include
#includeint system(const char * cmdstring)
{pid_t pid;int status;if(cmdstring == NULL){      return (1);}if((pid = fork())<0){status = -1;}else if(pid == 0){execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);-exit(127); //子进程正常执行则不会执行此语句}else{while(waitpid(pid, &status, 0) < 0){if(errno != EINTER){status = -1;break;}}}return status;
}

7、popen函数

1.函数的作用

popen函数用于创建一个管道并打开一个新的进程或命令。它允许在一个进程中执行一个命令,并通过文件流进行输入和输出。popen返回一个文件指针,可以用于读取命令的输出或向命令传递输入

2.函数的具体运用

popen 会创建一个子进程来执行指定的命令。popen的工作机制涉及到使用 fork 创建一个子进程,然后在子进程中使用 exec 系列函数执行指定的命令。具体来说,popen会创建一个管道,并调用 fork 来创建一个子进程。在子进程中,通过调用 exec 函数来执行指定的命令,这就替换了子进程的映像为要执行的命令。父进程则可以通过管道与子进程通信,可以读取或写入子进程的标准输入和标准输出。在子进程执行完毕后,popen 会关闭相关的管道并等待子进程的结束。然后它会返回一个文件指针,通过这个文件指针你可以读取或写入子进程的标准输出或标准输入。

函数原型

FILE *popen(const char *command, const char *mode);

参数:

  • command: 要执行的命令字符串。
  • mode: 打开文件的模式,可以是 "r"(读取)或 "w"(写入)。

返回值:

  • 如果成功,返回一个指向文件的指针。
  • 如果失败,返回 NULL

 3.示例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>int main() {char dis[10240] = {0}; // 存储命令输出的缓冲区FILE *file = NULL; // 文件指针用于处理命令输出流// 使用popen打开一个管道并执行 "ls -l" 命令file = popen("ls -l", "r");if (file == NULL) {perror("popen");return -1;}// 读取命令输出到缓冲区,并获取读取的字节数,size_t无符号的整形size_t bytesRead = fread(dis, 1, sizeof(dis) - 1, file);if (bytesRead > 0) {dis[bytesRead] = '\0'; // 在读取的字符串后添加字符串结束符,%z通常用于表示 size_t 类型的值printf("Read %zu bytes:\n%s\n", bytesRead, dis);} else {printf("读取失败.\n");}// 关闭文件指针,等待子进程结束pclose(file);return 0;
}

相关文章:

Linux系统编程之进程

目录 1、进程关键概念 1.什么是程序&#xff0c;什么是进程&#xff0c;有什么区别 2.如何查看系统中有那些进程 3.什么是进程标识符 4.什么叫父进程&#xff0c;什么叫子进程 5.C语言的存储空间是如何分配的 2、进程创建 1.fork函数创建进程 2.vfork函数创建进程 3、…...

Vue中使用require.context自动引入组件的方法介绍

我们项目开发中&#xff0c;经常需要import或者export各种模块&#xff0c;那么有没有什么办法可以简化这种引入或者导出操作呢&#xff1f;答案是肯定的&#xff0c;下面就为大家介绍一下require.context require.context 是 webpack 提供的一个 API&#xff0c;用于创建 con…...

Java 监控诊断利器 Arthas monitor/watch/trace 命令使用详解

目录 一、命令介绍二、测试Demo三、命令使用示例3.1、monitor 命令3.1.1、监控primeFactors方法调用情况&#xff08;5秒一个周期&#xff0c;每过5秒将这5秒统计的信息输出&#xff09;3.1.2、监控primeFactors方法调用情况&#xff08;5秒一个周期&#xff0c;每过5秒将这5秒…...

论文阅读:基于MCMC的能量模型最大似然学习剖析

On the Anatomy of MCMC-Based Maximum Likelihood Learning of Energy-Based Models 相关代码&#xff1a;点击 本文只介绍关于MCMC训练的部分&#xff0c;由此可知&#xff0c;MCMC常常被用于训练EBM。最后一张图源于Implicit Generation and Modeling with Energy-Based Mod…...

【Verilog】期末复习——设计一个带异步复位端且高电平有效的32分频电路

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…...

基于springboot的java读取文档内容(超简单)

读取一个word文档里面的内容&#xff0c;并取出来。 代码&#xff1a; SneakyThrowsGetMapping(value "/readWordDoc")ApiOperationSupport(order 1)ApiOperation(value "文档读取 ", notes "文档读取 ")public R ReadWordDoc () {System.o…...

K8S亲和性,反亲和性,及污点

nodeName&#xff1a;硬匹配&#xff0c;不走调度策略 nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走调度的算法 只要是走调度算法&#xff0c;在不满足预算策略的情况下&#xff0c;所有pod都是pending node节点的亲和性&#xff1a; 硬策略&#xff1a;必…...

2024年,AI、Web3、区块链、元宇宙:有没有“相互成就“的可能性?

加密圈最近有点冷清&#xff0c;曾经是科技界的宠儿&#xff0c;去年中旬开始一直在被SEC的诉讼困扰着&#xff0c;而且正处冷清的熊市&#xff0c;被迫居于 AI 后面的次要地位。 曾在 Web3 领域活跃并具有影响力的企业家 Jeremiah Owyang 住在旧金山&#xff0c;目前也深入研…...

Mac电脑好用的修图软件:Affinity Photo 2中文 for Mac

Affinity Photo 2提供了广泛的图像编辑和调整工具&#xff0c;使用户能够对照片进行精确的编辑和改进。它支持图像裁剪、旋转、缩放、变形等操作&#xff0c;以及曝光、色彩、对比度、饱和度等调整。 非破坏性编辑&#xff1a;软件采用非破坏性编辑方式&#xff0c;即对原始图…...

数据结构之Radix和Trie

数据结构可视化演示链接&#xff0c;也就是视频中的网址 Radix树&#xff1a;压缩后的Trie树 Radix叫做基数树&#xff08;压缩树&#xff09;&#xff0c;就是有相同前缀的字符串&#xff0c;其前缀可以作为一个公共的父节点。同时在具体存储上&#xff0c;Radix树的处理是以…...

ctrl+c与kill -2的区别

单进程场景 在单进程的情况下&#xff0c;ctrlc和kill -2是一模一样的&#xff0c;都是向指定的进程发送SIGINT信号. 如果进程中注册了捕捉SIGINT信号的处理函数&#xff0c;那么这个信号会被进程处理&#xff0c;例如&#xff1a; void processB() {// Set signal handler …...

每日算法打卡:分巧克力 day 9

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 1227. 分巧克力 题目难度&#xff1a;简单 题目来源&#xff1a;第八届蓝桥杯省赛C A/B组,第八届蓝桥杯省赛Java A/B/C组 题目描述 儿童节那天有 …...

Golang switch 语句

简介 switch 语句提供了一种简洁的方式来执行多路分支选择 基本使用 基本语法如下&#xff1a; switch expression { case value1:// 当 expression 的值等于 value1 时执行 case value2:// 当 expression 的值等于 value2 switch 的每个分支自动提供了隐式的 break&#x…...

可碧教你C++——位图

本章节是哈希的延申 可碧教你C——哈希http://t.csdnimg.cn/3R8TU 一文详解C——哈希 位图 位图是基于哈希表的原理产生的一种新的container——bitset 基于哈希映射的原理&#xff0c;我们在查找的时候&#xff0c;可以直接去定址到元素的具体位置&#xff0c;然后直接访问该…...

2024年虚拟DOM技术将何去何从?

从诞生之初谈起&#xff0c;从命令式到声明式&#xff0c;Web开发的演变之路 Web开发的起源与jQuery的统治 在Web开发的早期阶段&#xff0c;操作DOM元素主要依赖命令式编程。当时&#xff0c;jQuery因其易用性而广受欢迎。使用jQuery&#xff0c;开发者通过具体的命令操作DOM&…...

基于51单片机的恒温淋浴器控制电路设计

标题&#xff1a;基于51单片机的智能恒温淋浴器控制系统设计与实现 摘要&#xff1a; 本论文主要探讨了一种基于STC89C51单片机为核心控制器的恒温淋浴器控制系统的详细设计与实现。系统通过集成温度传感器实时监测水温&#xff0c;结合PID算法精确控制加热元件工作状态&#…...

【redis】redis的bind配置

在配置文件redis.conf中&#xff0c;默认的bind 接口是127.0.0.1&#xff0c;也就是本地回环地址。这样的话&#xff0c;访问redis服务只能通过本机的客户端连接&#xff0c;而无法通过远程连接&#xff0c; 这样可以避免将redis服务暴露于危险的网络环境中&#xff0c;防止一些…...

C++ 继承

目录 一、继承的概念及定义 1、继承的概念 2、继承定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 1、菱形继承 2、虚拟继承 3、例题 八、继承的总结和反思…...

了解ASP.NET Core 中的文件提供程序

写在前面 ASP.NET Core 通过文件提供程序来抽象化文件系统访问。分为物理文件提供程序(PhysicalFileProvider)和清单嵌入的文件提供程序(ManifestEmbeddedFileProvider)还有复合文件提供程序(CompositeFileProvider )&#xff1b;其中PhysicalFileProvider 提供对物理文件系统…...

竞赛保研 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…...

JavaScript音视频,JavaScript简单获取电脑摄像头画面并播放

前言 本章实现JavaScript简单获取电脑摄像头画面并播放的功能 兼容性(不支持Node.js) 需要注意的是,由于涉及到用户的隐私和安全,获取用户媒体设备需要用户的明确同意,并且可能需要在用户的浏览器中启用相关的权限。在某些浏览器中,可能需要用户手动开启摄像头权限。 …...

《JVM由浅入深学习【五】 2024-01-08》JVM由简入深学习提升分享

目录 JVM何时会发生堆内存溢出&#xff1f;1. 堆内存溢出的定义2. 内存泄漏的原因3. 堆内存溢出的常见场景4. JVM参数调优5. 实际案例分析 JVM如何判断对象可以回收1.可达性分析的基本思路2.实际案例3.可以被回收的对象4.拓展&#xff0c; 谈谈 Java 中不同的引用类型? 结语感…...

FastDFS之快速入门、上手

知识概念 分布式文件系统 通过计算机网络将各个物理存储资源连接起来。通过分布式文件系统&#xff0c;将网络上任意资源以逻辑上的树形结构展现&#xff0c;让用户访问网络上的共享文件更见简便。 文件存储的变迁&#xff1a; 直连存储&#xff1a;直接连接与存储&#xf…...

Vue 中的 ref 与 reactive:让你的应用更具响应性(中)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

【数据库基础】Mysql与Redis的区别

看到一篇不错的关于“Mysql与Redis的区别”的文章&#xff0c;转过来记录下~ 文章目录 一、数据库类型二、运行机制三、什么是缓存数据库呢&#xff1f;四、优缺点比较五、区别总结六、数据可以全部直接用Redis储存吗&#xff1f;参考资料 一、数据库类型 Redis&#xff1a;NOS…...

JVM工作原理与实战(六):类的生命周期-连接阶段

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载&#xff08;Loading&#xff09; 2.连接&#xff08;Linking&#xff09; 3.初始化&#xff08;Initialization&#xff09; 4.使用&#xff08;Using&…...

【OCR】 - Tesseract OCR在Windows系统中安装

Tesseract OCR 在Windows环境下安装Tesseract OCR&#xff08;Optical Character Recognition&#xff09;通常包括以下几个步骤&#xff1a; 下载Tesseract 访问Tesseract的GitHub发布页面&#xff1a;https://github.com/tesseract-ocr/tesseract/releases找到适合你操作系…...

YOLOv8改进 | 损失函数篇 | SlideLoss、FocalLoss分类损失函数助力细节涨点(全网最全)

一、本文介绍 本文给大家带来的是分类损失 SlideLoss、VFLoss、FocalLoss损失函数,我们之前看那的那些IoU都是边界框回归损失,和本文的修改内容并不冲突,所以大家可以知道损失函数分为两种一种是分类损失另一种是边界框回归损失,上一篇文章里面我们总结了过去百分之九十的…...

计算机网络试题——填空题(附答案)

在OSI模型中&#xff0c;第一层是____________层。 答案&#xff1a;物理&#xff08;Physical&#xff09; TCP协议是一种_____________连接的协议。 答案&#xff1a;面向连接&#xff08;Connection-oriented&#xff09; IPv6地址的位数是____________。 答案&#xff1a;1…...

第二证券:股票私募仓位指数创近八周新高

1月8日&#xff0c;A股几大首要指数全线收跌&#xff0c;上证指数收于日内最低点2887.54点&#xff0c;间隔上一年5月份的阶段高点3418.95点现已跌去了15.54%。 不过&#xff0c;虽然商场仍未清晰止跌&#xff0c;私募基金们却现已进场“抄底”。私募排排网最新发布的私募仓位…...

重庆技术支持 网站建设公司/百度知道下载

1. 在<form><form/>标签里面的<button>标签要设置type"button"&#xff0c;否则可能会在点击按钮时自动提交这个表单 2. //todo转载于:https://www.cnblogs.com/alanleung/p/8510094.html...

一级a做爰片偷拍免费网站/百度网站排名查询

[url]http://blog.sina.com.cn/s/blog_72b4c81f0100rjy8.html[/url]1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法&#xff0c;它可以从当前事务或者一个新的事务获得一个hibernate session&#xff0c;需要程序维护ses…...

网站开发 发表文章/广州seo搜索

一、编辑器 1.链接 我们很多时候需要引用别人或自己以前的代码。这里可以很方便的加上链接。 一个添加链接 一个取消链接 选中要链接的文字右键就可以选中链接。 填入URL地址&#xff0c;目标一般选择在新窗口打开。 2.书签 插入书签 写入书签名 这样可以在文章开始写目录 跳到…...

网站开发语言识别/全国疫情高峰感染进度查询

题解&#xff1a; 首先来系统回顾一下背包问题&#xff08;0-1背包和完全背包最大不同就是遍历顺序&#xff09; 0-1背包 1.物品只能拿一次 2.遍历顺序只能倒序 3.先遍历物品&#xff0c;再遍历背包 题型&#xff1a; 1.能够否装满容量为target的背包&#xff1a;return…...

哪些网站用python做服务框架/潍坊快速网站排名

影评分析第2篇写在前面 日本电视动画《BORUTO -火影新世代》&#xff08;中国大陆译名《博人传&#xff1a;火影忍者新时代》&#xff09;改编自岸本齐史原作并监修、池本干雄编绘、小太刀右京编剧的同名漫画&#xff0c;是《火影忍者》系列的续篇&#xff0c;讲述原作故事完结…...

wordpress图片不居中/直通车关键词怎么选 选几个

//为什么会出现上方向和左方向的子弹不能发射的情况&#xff1f;检查了好久&#xff0c;有大佬帮帮忙吗&#xff0c;小白睡不着package TanKe.lbl;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.util.concurrent.atomic.Dou…...