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

Linux高级编程——进程

1.进程的含义?

进程是一个程序执行的过程,会去分配内存资源,cpu的调度

PID, 进程标识符
当前工作路径   chdir
umask  0002
进程打开的文件列表  文件IO中有提到 (类似于标准输入 标准输出的编号,系统给0,1,2

                                                                标准输入 标准输出 标准错误)
信号相关设置 处理异步io,

用户id,组id


进程资源的上限的命令:ulimit -a,显示资源上限。

2.进程和程序的区别?
(1)程序:静态
存储在硬盘中代码,数据的集合
(2)进程:动态
程序执行的过程,包括进程的创建、调度、消亡
.c ----> a.out-----> process(pid)
1)程序是永存,进程是暂时
2)进程有程序状态的变化,程序没有
3)进程可以并发,程序无并发
4)进程与进程会存在竞争计算机的资源
5)一个程序可以运行多次,变成多个进程
一个进程可以运行一个或多个程序
内存的分布
0-3G,是进程的空间,3G-4G是内核的空间,虚拟地址
虚拟地址 *  物理内存和虚拟内存的地址 映射表 1page=4k    mmu

这部分占3G,其他部分是操作系统

进程分类:
1、交互式进程
2、批处理进程   shell脚本 
3、 守护进程 


3.进程的作用? 并发,并行区别。
while (1) { while (1) { 上下左右
发视频
} }

同一时刻完成多个任务
4.进程的状态:
3个状态,就绪→执行态→阻塞(等待,睡眠)基本操作系统

linux中的状态,运行态,睡眠态,僵尸,暂停态。

5.进程的调度,进程上下文切换
内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动
调度算法, other,idle
             rr,fifo
宏观并行
微观串行

6.查询进程相关命令
 

1.ps aux

查看进程相关信息

1.就绪态、运行态 R
2.睡眠态、等待态
可唤醒等待态 S
不可唤醒等待态 D
3.停止态 T
4.僵尸态 Z
5.结束态

2.top
根据CPU占用率查看进程相关信息

3.kill和killall发送一个信号
kill -2 PID  15
发送信号+PID对应的进程,默认接收者关闭

killall -9 进程名
发送信号 进程名对应的所有进程
killall a.out

原语:
1.fork();
pid_t fork(); 叉子
一次调用,会返回两次。
子进程先进行和是父进程先进程,顺序不确定。

父与子 的 变量不共享。


子进程复制父进程的0到3g空间和父进程内核中的PCB但id号不同

但子的id号不是0,

功能:通过该函数可以从当前进程中克隆一个同名新进程。
  克隆的进程称为子进程,原有的进程称为 父进程。
  子进程是父进程的完全拷贝。
  子进程的执行过程是从fork函数之后执行。
  
  子进程与父进程具有相同的代码逻辑。

返回值:int 类型的数字。
在父进程中:成功 返回值是子进程的pid号 >0
失败 返回-1;
在子进程中:成功 返回r'r'r'r'r'r'r'r'r'r'r'r'r值 0
失败 无


面试题:
一次fork生成几个进程?他们之间的关系是什么样的?
如果两次fork同时前后执行,会生成几个进程?他们之间的
关系如何表示,有多少个子进程,有没有孙进程?
2.getpid
pid_t getpid(void);
功能:
获得调用该函数进程的pid
参数:
缺省
返回值:
进程的pid
       
  
pid_t getppid(void);
功能:
获得调用该函数进程的父进程pid号
参数:
缺省
返回值:
返回父进程id号

fork()&&fork()||fork();


while(1)sleep(1);
应用场合
1)一个进程希望复制自己,使父子进程同时执行同的代码段。网络服务中会比较多见。
2)一个进程需要执行一个不同的程序。fork+exec

7、父子进程的关系:
子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。
在fork之后,一般情况那个会先运行,是不确定的。如果非要确定那个要先运行,需要IPC机制。

区别:
1)fork的返回值
2)pid不同(一般来说子的要比父的大)


8、进程的终止:8种情况
正常结束:

1)main 中return
2)exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。已经清理数(atexit) 。
3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。
4) 主线程退出
5)主线程调用pthread_exit
异常终止
6)abort()  在非常紧急的情况内核调用函数来退出进程
7)signal   kill pid
8)最后一个线程被pthread_cancle
 

9.僵尸进程和孤儿进程

危害

孤儿进程(Orphan Process)

定义

产生原因

特点

  • 僵尸进程(Zombie Process)

    定义

  • 僵尸进程是指一个已经终止、但是其父进程尚未对其进行善后处理的(获取终止进程的有关信息,释放它仍占用的资源)的进程。
  • 产生原因

  • 当子进程比父进程先结束,而父进程没有回收子进程,释放子进程占用的资源时,子进程将成为一个僵尸进程。
  • 特点

  • 僵尸进程不占用除进程表项外的任何系统资源。
  • 僵尸进程不能被kill命令杀死,因为它已经不存在于活动进程列表中。
  • 如果父进程不调用wait或waitpid等函数来回收僵尸进程,那么保留的那段信息就不会释放,其进程号就会一直被占用。
  • 系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
  • 孤儿进程是指在其父进程执行完成或被终止后仍继续运行的一类进程。
  • 当一个父进程由于正常完成工作而退出或由于其他情况被终止,而它的一个或多个子进程却还在运行时,这些子进程将成为孤儿进程。
  • 孤儿进程会被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
  • 孤儿进程本身并没有危害,因为它们的资源回收工作由init进程负责。

1)exit     库函数
退出状态,终止的进程会通知父进程,自己使如何终止的。如果是正常结束(终止),则由exit传入的参数。如果是异常终止,则有内核通知异常终止原因的状态。任何情况下,负进程都能使用wait,waitpid获得这个状态,以及资源的回收。

缓冲区里的数据还会被保留
void exit(int status) 
exit(1);
功能:
让进程退出,并刷新缓存区
参数:
status:进程退出的状态
返回值:
缺省

EXIT_SUCCESS 0
EXIT_FAILURE 1

return  当该关键字出现在main函数中时候可以结束进程
如果在其他函数中则表示结束该函数。
exit -> 刷新缓存区 -> atexit注册的退出函数 -> _exit】

2)._exit    系统调用
void _exit(int status);
功能:
让进程退出,不刷新缓存区
参数:
status:进程退出状态
返回值:
缺省

缓冲区的数据不会被保留


 mian(int agc,argv)
{
main();
}  

//缓冲区//

行缓冲

全缓冲(文件)

缓冲区大小为4k

出缓冲区的条件少了一个“\n”.

回调函数:调用下面的函数时,在()里填入函数,这个函数是进程退出前执行的函数
3.atexit
int atexit(void (*function)(void));

函数类型不能变化

功能:
注册进程退出执行的函数(资源回收,清理函数)
参数:
function:函数指针
指向void返回值void参数的函数指针
返回值:
成功返回0
失败返回非0

当程序调用exit或者由main函数执行return时,所有用atexit
注册的退出函数,将会由注册时顺序倒序被调用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char * tmp=NULL;
void clean(void)
{printf("this is clean %s\n",tmp);free(tmp);
}
int main(int argc, char *argv[])
{atexit(clean);tmp =(char*) malloc(50);strcpy(tmp,"hello");printf("123123\n");return 0;
}

4、进程空间的回收

exit(20); ()里的数字填入哪个都可以只要不超过127

wait/waitpid

pid_t wait(int *status);
功能:该函数可以阻塞等待任意子进程退出
      并回收该进程的状态。
       一般用于父进程回收子进程状态。

参数:status 进程退出时候的状态
  

返回值:成功 回收的子进程pid
失败 -1;

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{pid_t pid = fork();if(pid>0){printf("father pid:%d ppid:%d\n",getpid(),getppid());pid_t recycle_pid = wait(NULL);printf("recycle pid %d\n",recycle_pid);sleep(10);printf("aaa\n");}else if(0 == pid){sleep(3);    printf("child pid:%d ppid:%d\n",getpid(),getppid());exit(0);}else {perror("fork");return 1;}return 0;
}

用以下宏来判断status进程退出时的状态:

如果不关心其退出状态一般用NULL表示
  如果要回收进程退出状态,则用WEXITSTATUS回收。

WIFEXITED(status)  是不是正常结束 

WEXITSTATUS(status) 使用这个宏去那返回值

WIFSIGNALED(status) 是不是收到了信号而终止的   

WTERMSIG(status)如果是信号终止的,那么是几号信号。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{pid_t pid = fork();if(pid>0){//stat("1.txt",&st);int status;printf("father pid:%d ppid:%d\n",getpid(),getppid());pid_t recycle_pid = wait(&status);if(WIFEXITED(status)){printf("child normal terminal,recycle pid %d , exit value %d\n",recycle_pid,WEXITSTATUS(status));}if(WIFSIGNALED(status)){printf("child terminal bu signal ,rrecycle pid %d, signal num %d \n",recycle_pid,WTERMSIG(status));}}else if(0 == pid){printf("child pid:%d ppid:%d\n",getpid(),getppid());sleep(5);    exit(20);}else {perror("fork");return 1;}return 0;
}

pid_t wait(int *status);

    1)如果所有的子进程都在运行,在阻塞
    2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。
    3)如果没有子进程,则立即出错退出。

    waitpid(-1,status,0)=wait(status);
    pid_t waitpid(pid_t pid, int *status, int options);
    < -1 回收指定进程组内的任意子进程
    -1 回收任意子进程,组内外
    0 回收和当前调用waitpid一个组的所有子进程,组内
    > 0 回收指定ID的子进程
     waitpid (-1,a,0)  == wait(a);
     status 子进程退出时候的状态,
              如果不关注退出状态用NULL;
      options 选项:
                  0  表示回收过程会阻塞等待
                WNOHANG 表示非阻塞模式回收资源。
    返回值:成功 返回接收资源的子进程pid
        失败  -1
        0,
        
        EAGAIN

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{pid_t pid = fork();if(pid>0){//stat("1.txt",&st);int status;printf("father pid:%d ppid:%d\n",getpid(),getppid());while(1){pid_t recycle_pid = waitpid(pid,&status,WNOHANG );if(recycle_pid == pid){if(WIFEXITED(status)){printf("child normal terminal,recycle pid %d , exit value %d\n",recycle_pid,WEXITSTATUS(status));}if(WIFSIGNALED(status)){printf("child terminal bu signal ,rrecycle pid %d, signal num %d \n",recycle_pid,WTERMSIG(status));}break;}else {printf("子进程未结束,稍后在试\n");}}}else if(0 == pid){printf("child pid:%d ppid:%d\n",getpid(),getppid());sleep(5);    exit(20);}else {perror("fork");return 1;}return 0;
}

练习:
    设计一个多进程程序,用waitpid函数指定回收
    其中的某个进程资源并将其状态打印输出。
    其他的进程都以非阻塞方式进行资源回收。
    

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{int i = 0;pid_t pid[5]={0};for(i=0;i<5;i++){pid[i] = fork();if(pid[i]>0){continue;}else if(0 == pid[i]){printf("child pid:%d ppid:%d\n",getpid(),getppid());sleep(rand()%5+1);    exit(0);}else {perror("fork");return 1;}}int status;while(1){pid_t recycle_pid = waitpid(pid[2],&status,WNOHANG );if(recycle_pid == pid[2]){if(WIFEXITED(status)){printf("child normal terminal,recycle pid %d , exit value %d\n",recycle_pid,WEXITSTATUS(status));}if(WIFSIGNALED(status)){printf("child terminal bu signal ,rrecycle pid %d, signal num %d \n",recycle_pid,WTERMSIG(status));}break;}else {// printf("子进程未结束,稍后在试\n");}}return 0;
}

10.execute
exec族
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),
子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的
用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。执行完毕不回原程序调用exec并不创建
新进程,所以调用exec前后该进程的id并未改变。
其实有六种以exec开头的函数,统称exec函数:
vector
ls -l -i list 
execl("/bin/ls","-l","-i",NULL);
execlp("ls","-l","-i",NULL);
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);

key=value
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execle(const char *path, const char *arg, ..., char *const envp[]);

int execve(const char*path,char*const argv[],char*const evnp[]);
int execlp(const char *file, const char *arg, ...);
echo $PATH
PATH= 
int execvp(const char *file, char *const argv[]);


int execve(const char *path, char *const argv[], char *const envp[]);

这些函数的区别
    1),前4个使用路径名作为参数,后面两个使用文件名做参数
    当filename中,含有/时视为路径名,否则就按PATH变量,在指定目录下查找可执行文件。
    2)相关的参数表传递
    l表示list,v表示vector
    execl,execlp,execle,需要将参数一个一个列出,并以NULL结尾。
    execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。

    3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。其他未指定环境变量,使用父进程继承过来的。(一般不调用带环境变量的,不主动改变环境变量)
execve 是真正的系统调用
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错
则返回-1,所以exec函数只有出错的返回值而没有成功的返回值。

char *const ps_argv[] ={"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
char *const ps_envp[] ={"PATH=/bin:/usr/bin", "TERM=console", NULL};
execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execv("/bin/ps", ps_argv);
execle("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, ps_envp);
execve("/bin/ps", ps_argv, ps_envp);
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execvp("ps", ps_argv);

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{// firefox www.taobao.com execl("/usr/bin/firefox","firefox","www.taobao.com",NULL);printf("看见就错了\n");return 0;
}
#include<stdio.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{//execl("/bin/ls","ls","-a","-l","-h","-F","--color",NULL);//p:系统中的环境路径env path能找到execlp("ls","ls","-a","-l","-h","-F","--color",NULL);return 0;
}
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{char*const arg[]={"ls","-a","-l","-h","-F","--color",NULL};execv("/bin/ls",arg);printf("看见就错了\n");return 0;
}
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{char*const arg[]={"ls","-a","-l","-h","-F","--color",NULL};execvp(arg[0],arg);printf("看见就错了\n");return 0;
}

在一个程序main中调用文件中另一个程序  1.c


#include <stdio.h>
int main(int argc, char *argv[])
{printf("argc is %d\n",argc);int i = 0 ;for(i=0;i<argc;i++){printf("%d %s\n",i,argv[i]);}return 0;
}
#include<stdio.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{execl ("/home/linux/cpz/process/cpz","./cpz","1","2","3","4",NULL);return 0;
}


 

相关文章:

Linux高级编程——进程

1.进程的含义? 进程是一个程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度 PID, 进程标识符 当前工作路径 chdir umask 0002 进程打开的文件列表 文件IO中有提到 &#xff08;类似于标准输入 标准输出的编号&#xff0c;系统给0&#xff0c;1&#xf…...

手机数据恢复篇:如何在OPPO中恢复永久删除的视频?

说到丢失重要的记忆&#xff0c;如何在OPPO设备中恢复永久删除的视频是一个经常困扰许多用户的话题。意外删除重要视频的情况并不少见&#xff0c;对许多人来说&#xff0c;意识到它们已经消失可能很困难。但是&#xff0c;在正确的指导、方法和工具的帮助下&#xff0c;可以找…...

Obsidan插件开发

1 Obidian 开发 Obsidian 基于 Electron 框架开发&#xff0c;其前端主要使用了 HTML、CSS 和 JavaScript&#xff0c;而后端使用了 Node.js。Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;使 JavaScript 能在服务器端运行。 在开发 Obsidian 插件时&…...

【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!

目录 1. 引言1.1 数字人技术的发展背景1.2 DUIX数字人项目的开源意义1.3 DUIX数字人技术的独特价值1.4 本文目的与结构 2. DUIX数字人概述2.1 定义与核心概念2.2 硅基智能与DUIX的关系2.3 技术架构2.4 开源优势2.5 应用场景2.6 安全与合规性 3. DUIX数字人技术特点3.1 开源性与…...

微信小程序服务器从腾讯云迁移到阿里云出现的坑

微信小程序服务器从腾讯云迁移到阿里云出现的坑 背景 原先小程序后台服务器到期&#xff0c;因为之前买的是腾讯云新用户&#xff0c;便宜&#xff0c;到期后续费金额懂的都懂。就在阿里云用新用户买了个新的&#xff0c;遂把服务全转到了阿里云服务器上。 此时&#xff0c;域…...

SQL Server触发器深度解析:数据完整性的守护者

标题&#xff1a;SQL Server触发器深度解析&#xff1a;数据完整性的守护者 摘要 在SQL Server中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在特定数据库事件发生时自动执行。触发器主要用于维护数据的完整性和实施复杂的业务规则。本文将详细介绍SQL Server中触…...

Qt信号槽的坑

1、重载的信号&#xff08;以QSpinBox为例&#xff09; 像是点击按钮之类的信号槽很好连接&#xff0c;这是因为它的信号没有重载&#xff0c;如果像SpinBox那样有重载信号的话&#xff08;Qt5.12的见下图&#xff0c;不过Qt5.15LTS开始就不再重载而是换信号名了&#xff09;&…...

昇思MindSpore学习笔记1--基本介绍

昇思MindSpore是一个全场景深度学习框架。 一、框架组成 1. 模型库ModelZoo 提供深度学习算法网络。 2. 扩展库MindSpore Extend 拓展领域场景&#xff0c;如GNN/深度概率编程/强化学习等。 3. 科学计算MindSpore Science 科学计算套件。 包含数据集、基础模型、预置高精度模…...

Github Page 使用手册(保姆级教程!)

搭建个人网站&#xff1f;没有服务器&#xff1f;那不如尝试一下 Github Page &#xff01; 最近我正好在搭建个人网站&#xff0c;于是就写一篇博客来详细介绍 Github Page 的使用、部署方式吧&#xff01; 一、进入 Github 访问&#xff1a;github.com 如果你没有 github…...

zram压缩机制看swapon系统调用

1.swapon开启zram交换分区 swapon /dev/block/zram0 mkswap /dev/block/zram0 上面命令调用了linux的swapon系统调用启动zram0交换分区;mkswap命令向块设备文件/dev/block/zram0写入了swap_header信息 问题&#xff1a;实际安卓平台是哪里触发swapon和mkswap调用的&#xff…...

SpringBoot2+Vue3开发博客管理系统

项目介绍 博客管理系统&#xff0c;可以帮助使用者管理自己的经验文章、学习心得、知识文章、技术文章&#xff0c;以及对文章进行分类&#xff0c;打标签等功能。便于日后的复习和回忆。 架构介绍 博客管理系统采用前后端分离模式进行开发。前端主要使用技术&#xff1a;Vu…...

JS【详解】Symbol (含Symbol 作为属性名,静态方法for 和 keyFor,11 个内置的 Symbol 值)

ES6 语法&#xff0c;表示唯一且不可变的值&#xff0c;常用作属性键值或者唯一标识符。 let a Symbol() let a Symbol(atomic symbol)console.log(Symbol() Symbol()) // false console.log(Symbol(atom) Symbol(atom)) // falseSymbol 作为属性名 let key Symbol(); le…...

Vue 项目运行时,报错Error: Cannot find module ‘node:path‘

Vue 项目运行时&#xff0c;报错Error: Cannot find module ‘node:path’ internal/modules/cjs/loader.js:883throw err;^Error: Cannot find module node:path Require stack: - D:\nodejs\node_modules\npm\node_modules\node_modules\npm\lib\cli.js - D:\nodejs\node_mo…...

综合评价 | 基于组合博弈赋权的物流系统综合评价(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于组合博弈赋权的物流系统综合评价&#xff08;Matlab&#xff09; 组合博弈赋权&#xff08;Weighted Sum&#xff09;是一种常见的多目标决策方法&#xff0c;用于将多个目标指标进行综合评估和权衡…...

国标GB28181视频汇聚平台EasyCVR安防监控系统常见播放问题分析及解决方法

国标GB28181安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。平台支持多协议接入&#xff0c;包括&#xff1a;国标GB/T 28181协议、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视…...

30 哈希的应用

位图 概念 题目 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何判断一个数是否在这40亿个整数中 1.遍历&#xff0c;时间复杂度O(N) 2.二分查找&#xff0c;需要先排序&#xff0c;排序(N*logN)&#xff0c;二分查找&#xff0c;logN。…...

(笔记)Error: qemu-virgl: Failed to download resource “qemu-virgl--test-image“解决方法

错误&#xff1a; > Downloading https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.2/FD12FLOPPY.zip curl: (22) The requested URL returned error: 404Error: qemu-virgl: Failed to download resource "qemu-virgl--test-image" D…...

IntelliJ IDEA介绍

IntelliJ IDEA 是由 JetBrains 开发的一个集成开发环境 (IDE),专门为 Java 开发设计,同时也支持多种其他编程语言和框架。IntelliJ IDEA 以其智能代码分析、强大的重构功能以及丰富的插件生态系统而闻名,是许多开发者的首选 IDE。 IntelliJ IDEA介绍 IntelliJ IDEA 的主要…...

【office技巧】如何合并pdf并且添加目录页

所用工具&#xff1a;wps&#xff0c;acrobat reader 1.制作目录页 在wps里设置一级标题&#xff0c;二级标题&#xff0c;然后自动生成目录页&#xff0c;保存为pdf。 在acrobat reader里删除除了目录页之外的其他页面。 2.pdf合并 在acrobat reader里合并pdf。 注意有可能…...

Spring Boot中的安全性配置详解

Spring Boot中的安全性配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何在Spring Boot应用中实现全面的安全性配置&#xff0c;保…...

数据权限和字段权限设计指南

数据权限和字段权限的设计是信息系统安全的基础。随着数据量的增加和用户需求的多样化&#xff0c;合理的权限设计变得愈加重要。本文将介绍数据权限和字段权限的基本概念、设计思路和实际应用&#xff0c;帮助读者建立全面的权限管理体系。 2. 数据权限设计 2.1 数据权限的定…...

Linux 常用命令之 RZ和SZ 简介

一、引言 在Linux系统管理中&#xff0c;尤其是在远程操作时&#xff0c;文件的上传与下载是常见的需求。对于CentOS用户而言&#xff0c;rz和sz这两个命令提供了简单而高效的文件传输方式&#xff0c;尤其在SSH终端环境中更为便利。本文将详细介绍rz和sz命令的基本概念、如何…...

Docker Compose:简化多容器管理的利器

在现代的应用开发和部署过程中&#xff0c;Docker已经成为不可或缺的工具。它通过容器化技术&#xff0c;使得应用的部署变得更加轻松和高效。然而&#xff0c;当我们需要管理和运行多个容器时&#xff0c;单纯依赖Docker命令行工具可能会显得繁琐且复杂。这时&#xff0c;Dock…...

深度解析:机器学习如何助力GPT-5实现语言理解的飞跃

文章目录 文章前言机器学习在GPT-5中的具体应用模型训练与优化机器翻译与跨语言交流&#xff1a;情感分析与问答系统&#xff1a;集成机器学习功能&#xff1a;文本生成语言理解任务适应 机器学习对GPT-5性能的影响存在的挑战及解决方案技术细节与示例 文章前言 GPT-5是OpenAI公…...

Springcloud-消息总线-Bus

1.消息总线在微服务中的应用 BUS- 消息总线-将消息变更发送给所有的服务节点。 在微服务架构的系统中&#xff0c;通常我们会使用消息代理来构建一个Topic&#xff0c;让所有 服务节点监听这个主题&#xff0c;当生产者向topic中发送变更时&#xff0c;这个主题产生的消息会被…...

js 接收回调函数 转换为promise

下面是一个示例代码&#xff0c;展示如何编写一个接收回调函数并将其转换为 Promise 的 JavaScript 函数&#xff1a; // 定义一个接收回调函数并转换为 Promise 的函数 function convertCallbackToPromise(callbackFunction) {// 返回一个新的 Promise 对象return new Promis…...

Python 面试【★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

计算机网络(物理层)

物理层 物理层最核心的工作内容就是解决比特流在线路上传输的问题 基本概念 何为物理层&#xff1f;笼统的讲&#xff0c;就是传输比特流的。 可以着重看一下物理层主要任务的特性 传输媒体 传输媒体举例&#xff1a; 引导型传输媒体 引导型传输媒体指的是信号通过某种…...

OpenGL-ES 学习(6)---- 立方体绘制

目录 立方体绘制基本原理立方体的顶点坐标和绘制顺序立方体颜色和着色器实现效果和参考代码 立方体绘制基本原理 一个立方体是由8个顶点组成&#xff0c;共6个面&#xff0c;所以绘制立方体本质上就是绘制这6个面共12个三角形 顶点的坐标体系如下图所示&#xff0c;三维坐标…...

《数据结构与算法基础 by王卓老师》学习笔记——类C语言有关操作补充

1.元素类型说明 2.数组定义 3.C语言的内存动态分配 4..C中的参数传递 5.传值方式 6.传地址方式 例子...

高频面试题基本总结回顾2(含笔试高频算法整理)

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

《深入浅出MySQL:数据库开发、优化与管理维护(第3版)》

深入浅出MySQL sql执行流程第一步&#xff1a;通过连接器进行连接第二步&#xff1a;解析器解析 SQL第三步&#xff1a;执行SQL 行记录存储格式行溢出日志数据库三大范式第一范式第二范式第三范式 索引索引分类B树索引BTree vs Hash需要索引1、字段需要频繁的查询操作2、字段用…...

VBA技术资料MF171:创建指定工作表数的工作簿

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

【效率提升】新一代效率工具平台utools

下载地址&#xff1a;utools uTools这款软件&#xff0c;是一款功能强大且高度可定制的效率神器&#xff0c;使用快捷键alt space(空格) 随时调用&#xff0c;支持调用系统应用、用户安装应用和市场插件等。 utools可以调用系统设置和内置应用&#xff0c;这样可以方便快捷的…...

Jmeter插件管理器,websocket协议,Jmeter连接数据库,测试报告的查看

目录 1、Jmeter插件管理器 1、Jmeter插件管理器用处&#xff1a;Jmeter发展并产生大量优秀的插件&#xff0c;比如取样器、性能监控的插件工具等。但要安装这些优秀的插件&#xff0c;需要先安装插件管理器。 2、插件的下载&#xff0c;从Availabale Plugins中选择&#xff…...

Android中ViewModel+LiveData+DataBinding的配合使用(kotlin)

Android 中 ViewModel、LiveData 和 Data Binding 的配合使用&#xff08;Kotlin&#xff09; 摘要 本文将介绍如何在 Android 开发中结合使用 ViewModel、LiveData 和 Data Binding 进行数据绑定和状态更新。我们将详细探讨这三者之间的关系&#xff0c;并展示如何在 Kotlin…...

Elasticsearch 避免常见查询错误和陷阱

Elasticsearch 作为一款强大的搜索引擎和分析工具&#xff0c;已经被广泛应用于各种场景中。然而&#xff0c;在使用 Elasticsearch 进行查询时&#xff0c;如果不注意一些常见的错误和陷阱&#xff0c;可能会导致查询效率低下、结果不准确甚至系统性能下降。本文旨在总结一些常…...

【PyQt】20-QTimer(动态显示时间、定时关闭)

QTimer 前言一、QTimer介绍二、动态时间展示2.1 代码2.2 运行结果 三、定时关闭3.1 介绍他的两种用法1、使用函数或Lambda表达式2、带有定时器类型&#xff08;高级&#xff09; 3.2 代码3.3 运行结果 总结 前言 好久没学习了。 一、QTimer介绍 pyqt里面的多线程可以有两种实…...

[深度学习] 自编码器Autoencoder

自编码器&#xff08;Autoencoder&#xff09;是一种无监督学习算法&#xff0c;主要用于数据的降维、特征提取和数据重建。自编码器由两个主要部分组成&#xff1a;编码器&#xff08;Encoder&#xff09;和解码器&#xff08;Decoder&#xff09;。其基本思想是将输入数据映射…...

模型微调、智能体、知识库之间的区别

使用开源模型微调和使用知识库与智能体&#xff08;agent&#xff09;的区别主要体现在工作原理、应用场景和实现目标上。以下是对这三者的详细对比&#xff1a; 开源模型微调 定义&#xff1a; 微调是对预训练模型&#xff08;例如BERT、GPT等&#xff09;进行额外训练&…...

七日世界Once Human跳ping、延迟高、丢包怎么办?

七日世界是一款开放世界为轴点的生存射击游戏&#xff0c;玩家将进入一个荒诞、荒芜的末日世界&#xff0c;在这里与好友一起对抗可怖的怪物和神秘物质星尘的入侵&#xff0c;给这个星球留下最后的希望&#xff0c;共筑一片安全的领地。不过有部分玩家在游玩七日世界的时候&…...

机器人控制系列教程之关节空间运动控制器搭建(1)

机器人位置控制类型 机器人位置控制分为两种类型&#xff1a; 关节空间运动控制—在这种情况下&#xff0c;机器人的位置输入被指定为一组关节角度或位置的向量&#xff0c;这被称为机器人的关节配置&#xff0c;记作q。控制器跟踪一个参考配置&#xff0c;记作 q r e f q_{re…...

[linux]sed命令基础入门详解

sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理下一行&#xff0c;这…...

Charles抓包工具系列文章(一)-- Compose 拼接http请求

一、背景 众所周知&#xff0c;Charles是一款抓包工具&#xff0c;当然是http协议&#xff0c;不支持tcp。&#xff08;如果你想要抓tcp包&#xff0c;请转而使用wireshark&#xff0c;在讲述websocket的相关技术有梳理过wireshark抓包&#xff09; 话说回来&#xff0c;char…...

OLMo:真正完全开源的大模型

最近&#xff0c;又有一家机构AI2&#xff08;Allen Institute for AI&#xff09;开源了一个LLM&#xff1a;OLMo&#xff0c;它的英文全称就叫Open Language Model。相比之前开源的大模型&#xff0c;OLMo的独特之处是完全开源&#xff0c;除了训练的模型&#xff0c;OLMo还开…...

51单片机STC89C52RC——12.1 数据存储芯片AT24C02

目的/效果 利用存储芯片AT24C02存储数据&#xff0c;LCD1602显示存储的数据。 一&#xff0c;STC单片机模块 二&#xff0c;AT24C02存储芯片 2.1 介绍 AT24C02是一个2K位串行CMOS E2PROM&#xff0c;内部含有256个8位字节&#xff0c;采用先进CMOS技术实质上减少了器件的功…...

融入云端的心跳:在Spring Cloud应用中集成Eureka Client

融入云端的心跳&#xff1a;在Spring Cloud应用中集成Eureka Client 引言 在微服务架构中&#xff0c;服务发现是一个关键组件&#xff0c;它允许服务实例之间相互发现并通信。Netflix Eureka是Spring Cloud体系中广泛使用的服务发现框架。Eureka提供了一个服务注册中心&…...

CocosCreator构建IOS的wwise教程

CocosCreator构建IOS教程 添加wwise教程: 1.添加include 2.添加SoundEngine 3.添加Profile-iphoneos下面lib下面的.a 4.导入js调用C++的文件 5.导入这些文件 6.初始化ios绝对路径和TTS语音合成对象 6.获得根目录绝对路径,加载pck需要找到绝对路径。怎么找绝对路径? #impor…...

掌握 SQL Server 中的 FLOOR 函数:数据舍入的艺术

掌握 SQL Server 中的 FLOOR 函数&#xff1a;数据舍入的艺术 引言 在数据分析和处理中&#xff0c;我们经常需要对数值进行精确控制&#xff0c;比如将数值舍入到特定的精度。SQL Server 提供了多种数学函数&#xff0c;其中 FLOOR 函数就是用来执行向上舍入操作的强大工具。…...

【折腾笔记】兰空图床使用Redis做缓存

前言 最近发现我部署在群晖NAS上的兰空图床程序在高并发的情况下会导致图片加载缓慢或出现图片加载失败的情况&#xff0c;于是我查阅了官方文档资料并进行了一系列的测试&#xff0c;发现兰空图床如果开启了原图保护功能&#xff0c;会非常的吃CPU的性能&#xff0c;尤其是在…...

轻松设置:服务器域名配置全攻略

目录 前置条件 在阅读本篇内容之前&#xff0c;请先确保以下物料已准备好&#xff1a; 一台公网服务器&#xff0c;服务正常运行申请完成的域名&#xff0c;在对应域名服务商后台正常DNS解析域名备案完成可选条件&#xff1a;有https访问请求时&#xff0c;需要申请SSL证书 …...

Linux学习笔记(一)

命令格式 command [-options] [parameter] command&#xff1a;命令名&#xff0c;相应功能的英文单词或单词的缩写 [-options]&#xff1a;选项&#xff0c;可用来对命令进行控制&#xff0c;也可以省略 parameter&#xff1a;传给命令的参数&#xff0c;可以是零个、一个或者…...

基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…...

python入门详细介绍

Python 是一种广泛使用的高级编程语言&#xff0c;以其清晰的语法和代码可读性而闻名。它支持多种编程范式&#xff0c;包括面向对象、命令式、函数式和过程式编程。Python 由 Guido van Rossum 于1989年底发明&#xff0c;第一个公开发行版发行于1991年。 Python 的特点&…...

Linux CMakeLists编写之可执行程序

目录 1 概述2 文件命名3 实例4 代码分析 1 概述 编译工具有很多(make/cmake/BJam)。cmake是跨平台&#xff0c;使用cmake编译需要编写CMakeLists.txt。本文编写CMakeLists.txt来生成C可执行程序。 2 文件命名 文件命名为CMakeLists.txt,是一个文本文件,可以使用任何编辑器编辑…...

算力共享存在的痛点问题

目录 算力共享存在的痛点问题 一、资源分配不均 二、成本效益问题 三、技术兼容性和标准不统一 四、安全性和隐私保护问题 五、算力调度效率问题 算力共享存在的痛点问题 算力共享在当前阶段确实面临一些痛点问题&#xff0c;这些问题主要可以归纳为以下几个方面&#x…...

十几万预算还买威兰达?配置更高、动力更强的美系SUV不香

当大家手握十几万预算去选购合资SUV时,哪个品牌的车型更值得选购呢?要知道在十几万价位区间,合资SUV市场的竞争可以说是极其激烈,其中也涌现了许多热门产品,比如威兰达、CR-V和途岳等。不过问题来了,虽说大家花十几万块钱去选购威兰达并没有问题,但是却有比它性价比更高…...

威兰达卖15.38万元,2.0L/2.5L,油耗5.7L

念寒记得不久前,有好几位车友问过我关于丰田威兰达的问题,其中最关心的就是这款车会不会降价促销,毕竟现在的合资燃油车确实不太好卖,所以我估计还有很多车友都是这样的一个想法。这不,千等万等降价终于被你们给等到了。近日,广汽丰田专门针对对威兰达推出了一项重磅优惠…...

css卡片翻转 父元素翻转子元素不翻转效果

css卡片翻转 父元素翻转子元素不翻转效果 vue <div class"moduleBox"><div class"headTitle"><span class"headName">大额案例</span></div><div class"moduleItem"><span class"module…...

算法学习笔记(7)-贪心算法

##什么是贪心算法 一种常见的解决优化类型的问题&#xff0c;基本的思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优解的决策&#xff0c;以期待获得全局最优解。 ##贪心算法与动态规划的区别&#xff08;二者都为解决优化…...

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…...

CRMEB开源商城系统:全开源、高灵活性的电商解决方案

一、引言 随着电子商务的飞速发展&#xff0c;越来越多的企业和个人开始关注如何快速搭建一个稳定、高效且功能丰富的在线商城系统。在这样的背景下&#xff0c;CRMEB开源商城系统应运而生&#xff0c;凭借其前后端分离的架构、丰富的功能模块以及易用性&#xff0c;成为了众多…...