Linux系统 进程
Linux系统 进程
- 进程
- 私有地址空间
- 用户模式和内核模式
- 上下文切换
- 进程控制
- 进程控制函数
- 获取进程 ID
- 创建和终止进程
- 回收子进程
- 让进程休眠
- 加载并运行程序
- 系统调用错误处理
- 利用fork和execve运行程序
进程
异常是允许操作系统内核提供进程(process)概念的基本构造块,进程是计算机科学中最深刻、最成功的概念之一。异常控制流与进程有密切的关系,因为它为进程的多任务运行、异常处理和资源管理提供了基础。
进程是操作系统对正在运行的程序的一种抽象。它为每个程序提供了一种假象,仿佛每个程序都在独占地使用处理器、主存和 I/O 设备,而实际上系统中可能同时存在多个进程并发执行,操作系统负责管理和协调这些进程对硬件资源的共享。
私有地址空间
进程的私有地址空间包括
- 代码区:存放程序代码,通常是只读的,以防止程序意外修改自身指令。
- 数据区:包含已初始化的全局和静态变量。
- 堆区:从低地址向高地址增长,用于动态内存分配,如程序运行过程中根据需要创建的数据结构。
- 栈区:从高地址向低地址增长,用于存放函数调用相关信息,如局部变量、函数参数、返回地址等。
这种布局有助于组织和管理进程的数据和指令存储,并且通过地址空间的隔离保证了进程间的独立性和安全性,防止一个进程意外访问或修改另一个进程的数据。
用户模式和内核模式
在用户模式下,进程只能访问自己的虚拟内存空间,无法直接操作硬件或执行特权指令。而在内核模式下,进程具有完全的权限,可以访问整个内存空间并与硬件直接交互,操作系统的核心功能大多在内核模式下执行。
进程从用户模式切换到内核模式通常由系统调用、中断或异常触发。当进程请求操作系统服务时,它会通过系统调用触发模式切换。系统调用通过陷阱指令使得进程从用户模式转入内核模式,操作系统处理完请求后,再返回用户模式继续执行。
上下文切换
进程上下文包含了进程执行所需的所有信息,这些信息完整地描述了进程在某一时刻的执行状态,当进程被暂停或切换时,操作系统需要保存这些上下文信息,以便在下次恢复执行时能够准确地回到之前的执行状态。
- 程序计数器(PC)的值:指示下一条要执行的指令地址。
- 寄存器的值:包括通用寄存器、栈指针、程序状态字寄存器,用于存储进程当前的计算状态和临时数据。
- 页表:用于将虚拟地址转换为物理地址,实现内存管理。
- 内核栈:用于保存进程在内核态执行时的函数调用信息和临时数据。
进程控制
进程控制函数
获取进程 ID
#include <sys/types.h>
#include <unistd.h>pid_t getpid(void);
pid_t getppid(void);
// 返回:调用者或其父进程的 PID。
getpid
和 getppid
函数返回一个类型为 pid_t 的整数值,在 Linux 系统上它在 types.h 中被定义为 int。
创建和终止进程
#include <stdlib.h>void exit(int status);
// 该函数不返回。
exit 函数以 status 退出状态来终止进程(或返回一个整数值)。
#include <sys/types.h>
#include <unistd.h>pid_t fork(void);
// 返回:子进程返回 0,父进程返回子进程的 PID,如果出错,则为 -1。
父进程调用fork
后,操作系统会创建一个新的进程控制块(PCB)和地址空间等资源给子进程,然后将父进程的上下文复制到子进程中。之后,父进程和子进程从fork
函数返回后开始独立执行,虽然它们从相同的代码位置继续执行,但由于返回值不同,可以通过判断返回值来执行不同的代码分支,例如父进程可以在fork
后继续执行其他任务,同时等待子进程完成某些操作,而子进程可以执行特定于子进程的任务,如执行另一个程序等。
// 使用 fork 创建一个新进程
int main()
{pid_t pid;int x = 1;pid = Fork();if (pid == 0) { /* Child */printf("child : x=%d\n", ++x);exit(0);}/* Parent */printf("parent: x=%d\n", --x);exit(0);
}
linux> ./fork
parent:x=0
child :x=2
回收子进程
#include <sys/types.h>
#include <sys/wait.h>pid_t waitpid(pid_t pid, int *statusp, int options);
// 返回:如果成功,则为子进程的 PID,如果 WNOHANG,则为 0,如果其他错误,则为 -1。
pid
:指定要等待的子进程的 PID(进程标识符)。
- 如果
pid > 0
,则等待进程 ID 为pid
的子进程结束。 - 如果
pid == 0
,则等待与当前进程同属一个进程组的任何子进程结束。 - 如果
pid == -1
,则等待任何子进程结束(类似于wait
)。 - 如果
pid < -1
,则等待进程组 ID 为pid
的子进程结束(即进程组内的任何子进程)。
status
:指向整型变量的指针,用于存储子进程的退出状态。如果该参数为 NULL
,则不保存子进程的状态。
options
:控制等待行为的选项,常见的选项有:
WNOHANG
:非阻塞模式,如果没有子进程退出,waitpid
立即返回而不是阻塞。WUNTRACED
:在子进程停止(但没有终止)时也返回,即使它没有结束。WCONTINUED
:如果子进程因信号而暂停,可以在它继续运行时通知父进程。WNOHANG | WUNTRACED
:立即返回,如果等待集合中的子进程都没有被停止或终止,则返回值为 0;如果有一个停止或终止,则返回值为该子进程的 PID。
子进程的退出状态:如果 status
参数不为 NULL
,waitpid
会将子进程的退出状态存储在 status
指向的变量中。退出状态可以通过以下宏来解析:
WIFEXITED(status)
:如果子进程正常退出,返回真。WEXITSTATUS(status)
:返回子进程的退出码。只有在 WIFEXITED() 返回为真时,才会定义这个状态。WIFSIGNALED(status)
:如果子进程因为未捕捉到的信号退出,返回真。WTERMSIG(status)
:返回导致子进程终止的信号号码。WIFSTOPPED(status)
:如果子进程被信号暂停,返回真。WSTOPSIG(status)
:返回导致子进程暂停的信号号码。WIFCONTINUED(status)
:如果子进程因接收到继续信号(如SIGCONT
)而恢复,返回真。
错误条件:如果调用进程没有子进程,那么 waitpid 返回 -1,并且设置 errno 为 ECHILD。如果 waitpid 函数被一个信号中断,那么它返回 -1,并设置 errno 为 EINTR。
wait 函数
#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *statusp);
// 返回:如果成功,则为子进程的 PID,如果出错,则为 -1。
调用 wait(&status)
等价于调用 waitpid(-1, &status, 0)
。
让进程休眠
#include <unistd.h>unsigned int sleep(unsigned int secs);
// 返回:还要休眠的秒数。int pause(void);
// 总是返回 -1。
sleep
函数将一个进程挂起一段指定的时间。
pause
函数让调用函数休眠,直到该进程收到一个信号。
加载并运行程序
#include <unistd.h>int execve(const char *filename, const char *argv[],const char *envp[]);
// 如果成功,则不返回,如果错误,则返回 -1。
execve
是一个用于启动新程序的系统调用,它是 UNIX 和 Linux 系统中执行程序的重要机制。通过 execve
,当前进程可以加载并执行一个新的程序文件。执行该系统调用后,当前进程的地址空间(包括代码、数据、堆栈等)将被替换为新程序的内容,原进程的代码不再执行。
pathname
:要执行的程序的路径。它是一个以 null 结尾的字符串,指定了要执行的文件的绝对路径或相对路径。argv
:一个指向参数数组的指针,用于传递给新程序的命令行参数。它是一个数组,其中第一个元素通常是程序的名称,接下来的元素是传递给程序的各个参数。数组的最后一个元素必须是NULL
。envp
:一个指向环境变量数组的指针。它是一个包含环境变量的数组,每个环境变量是一个以=
分隔的字符串。数组的最后一个元素必须是NULL
。
int main(int argc, char *argv[], char *envp[]);
argc
是一个整数,表示命令行中传递给程序的参数的数量。它的值至少为 1,因为argv[0]
始终是程序的名称或路径。argv
是一个指向字符串数组的指针,数组中的每个元素是一个指向以 null 字符结尾的字符串的指针。这些字符串对应于命令行中传递给程序的参数。envp
是一个指向环境变量数组的指针。每个环境变量是一个以 null 字符结尾的字符串,它的格式通常是KEY=VALUE
,例如PATH=/usr/bin
。
当 main 开始执行时,用户栈的组织结构下图所示。从栈底(高地址)往栈顶(低地址)依次看。首先是参数和环境字符串。栈往上紧随其后的是以 null 结尾的指针数组,其中每个指针都指向栈中的一个环境变量字符串。全局变量 environ
指向这些指针中的第一个 envp[0]
紧随环境变量数组之后的是以 null 结尾的 argv[]
数组,其中每个元素都指向栈中的一个参数字符串。在栈的顶部是系统启动函数 libc_start_main
的栈帧。
操作环境数组
#include <stdlib.h>char *getenv(const char *name);
// 返回:若存在则为指向 name 的指针,若无匹配的,则为 NULL。
getenv
用于从环境变量中获取指定变量的值。环境变量是操作系统用于存储关于当前进程的配置信息的键值对,比如用户的主目录、系统路径等。
#include <stdlib.h>int setenv(const char *name, const char *newvalue, int overwrite);
// 返回:若成功则为 0,若错误则为 -1。void unsetenv(const char *name);
// 返回:无。
setenv
用于设置(或修改)一个环境变量的值。如果该环境变量已存在,它将被更新;如果不存在,它会被创建。
unsetenv
用于删除指定的环境变量。调用该函数后,该环境变量在当前进程的环境中将不再可用。
系统调用错误处理
void unix_error(char *msg)
{fprintf(stderr, "%s: %s\n", msg, strerror(errno));exit(0);
}
pit_t Fork()
{pit_t pid;if ((pid = fork()) < 0)unix_error("Fork error");return pid;
}
Unix 系统级函数出错时通常返回 -1 并设置 errno,上面是对系统调用的错误处理封装,下面的部分中都使用错误处理包装函数。它们能够保持代码示例简洁,而又不会给你错误的假象,认为允许忽略错误检査。包装函数定义在一个叫做 csapp.c 的文件中,它们的原型定义在一个叫做 csapp.h 的头文件中;可以从 CS:APP 网站上在线地得到这些代码。
利用fork和execve运行程序
实现了一个简单的命令行解释器(极简的 Shell),它可以读取用户输入的命令行,解析命令并执行。如果命令是内置命令(如quit
),则直接执行相应操作;如果是外部命令,则通过fork
创建子进程,在子进程中使用execve
来加载并执行该命令,父进程根据命令是否在后台运行来决定是否等待子进程结束。
#include "csapp.h"
#define MAXARGS 128// Evaluate a command line
void eval(char *cmdline);
// Parse the command line and build the argv array
int parseline(char *buf, char **argv);
// If first arg is a builtin command, run it and return true
int builtin_command(char **argv);int main()
{char cmdline[MAXLINE]; while (1) {// Readprintf("> ");Fgets(cmdline, MAXLINE, stdin);if (feof(stdin))exit(0);// Evaluateeval(cmdline); }return 0;
}void eval(char *cmdline)
{char *argv[MAXARGS]; // Argument list execve()char buf[MAXLINE]; // Holds modified command lineint bg; // Should the job run in bg or fg?pid_t pid; // Process idstrcpy(buf, cmdline);bg = parseline(buf, argv); if (argv[0] == NULL)return; // Ingore empty linesif (!(builtin_command(argv))) {if ((pid = Fork()) == 0) // Child runs user job{if (execve(argv[0], argv, environ) < 0){printf("%s Commmand not found.\n", argv[0]);exit(0);}}// Parent waits for foreground job to terminateif (!bg){int status;if (waitpid(pid, &status, 0) < 0)unix_error("waitfg: wait error");}elseprintf("%d %s", pid, cmdline);}
}int parseline(char *buf, char **argv)
{char *delim; // Points to first space delimiterint argc; // Number of argsint bg; // Background jobs?buf[strlen(buf) - 1] = ' '; // Replace trailing '\n' with spacewhile (*buf && (*buf == ' ')) // Ignore leading spacebuf++;// Build the argv listargc = 0;while ((delim = strchr(buf, ' '))) {*delim = '\0';argv[argc++] = buf;buf = delim + 1;while (*buf && (*buf == ' '))buf++;}argv[argc] = NULL;if (argc == 0) // Ignore blank linereturn 1;// Should the job run in the background?if (bg = ((*argv[argc-1]) == '&'))argv[--argc] = NULL;return bg;
}int builtin_command(char **argv)
{if (!strcmp(argv[0], "quit")) // quit commandexit(0);if (!strcmp(argv[0], "&")) // Ignore singletonreturn 1;return 0; // Not a builtin command
}
注意,这个简单的 shell 是有缺陷的,因为它并不回收它的后台子进程。修改这个缺陷就要求使用信号,详见信号部分。
相关文章:
Linux系统 进程
Linux系统 进程 进程私有地址空间用户模式和内核模式上下文切换 进程控制进程控制函数获取进程 ID创建和终止进程回收子进程让进程休眠加载并运行程序 系统调用错误处理利用fork和execve运行程序 进程 异常是允许操作系统内核提供进程(process)概念的基…...
文件具有selinux标签如下 system_u:object_r:httpd_sys_content:s0:c3 解释一下每段的含义?
文件具有selinux标签如下 system_u:object_r:httpd_sys_content:s0:c3 解释一下每段的含义? SELinux标签通常由四个部分组成,分别用于定义文件的上下文、访问控制策略以及系统安全性。针对你提供的标签:system_u:object_r:httpd_sys_content:s0:c3&…...
对偶分解算法详解及其Python实现
目录 对偶分解算法详解及其实现第一部分:对偶分解算法概述1.1 什么是对偶分解算法1.2 应用场景1.3 算法优点第二部分:对偶分解算法的数学推导2.1 问题形式2.2 对偶问题2.3 算法框架第三部分:对偶分解算法的Python实现第四部分:案例1——支持向量机中的对偶分解(策略模式)…...
Linux之web服务器
一、web 服务器简介 1.www 简介 www 是全球信息广播的意思,上网即使用 www 来查询信息,它结合多种多媒体,通过超链接以 Internet 传递信息。上网时,网站提供数据,客户端用浏览器解析数据。 www 所用协议为 HTTP&…...
十二、Pod的扩缩容-手动/自动-HPA
在实际生产系统中,经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。此时可以利用Deployment/RC的Scale机制来完成这些工作。 Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过运行kubectl sca…...
RabbitMQ高级特性:TTL、死信队列与延迟队列
RabbitMQ高级特性:TTL、死信队列与延迟队列 RabbitMQ作为一款开源的消息代理软件,广泛应用于分布式系统中,用于实现消息的异步传递和系统的解耦。其强大的高级特性,包括TTL(Time-To-Live)、死信队列&#…...
UPLOAD LABS | UPLOAD LABS 靶场初识
关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01:UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境,用于帮助用户了解文件上传漏洞的…...
杰发科技AC7803——不同晶振频率时钟的配置
计算公式 PLL_POSDIV [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62] PLL_PREDIV_1 1 2 4 USE_XTAL 24M SYSCLK_FREQ 64M SYSCLK_DIVIDER 1 VCO USE_XTAL*…...
cocos creator 触摸事件官方案例
cocos creator 触摸事件官方案例 1、官方示例; 2、对官方示例的总结: (1)介绍了鼠标事件和触摸事件的类型,这里主要关注的是在移动端和PC端都可以触发的触摸事件。 (2)节点事件的派发&#…...
浅谈人工智能之基于容器云进行图生视频大模型搭建
浅谈人工智能之基于容器云进行图生视频大模型搭建 根据之前我们所讲过的内容: 文生图 文生视频 我们继续讲解图生视频大模型搭建。 引言 随着深度学习技术的不断发展,图生视频(image-to-video)大模型成为了计算机视觉和自然语言…...
【爬虫框架:feapder,管理系统 feaplat】
github:https://github.com/Boris-code/feapder 爬虫管理系统 feaplat:http://feapder.com/#/feapder_platform/feaplat 爬虫在线工具库 :http://www.spidertools.cn :https://www.kgtools.cn/1、feapder 简介 对于学习 Python…...
txt地图格式处理
1、txt地图格式 [属性描述] 坐标系2000国家大地坐标系 几度分带3 投影类型高斯克吕格 计量单位米 带号38 精度0.001 转换参数,,,,,, [地块坐标] 5,475.888,1,测试地块1,面,J50G077061,公路用地,地下, J1,1,113.22222222222222,23.129111721551794 J2,1,113.2722314…...
【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...
蜜罐攻击网络渗透工具推荐
推荐一批侧重蜜罐攻击的网络渗透测试工具: Glastopf – 主要用于监测网络安全事件的工具。以蜜罐形式可以模拟数千个漏洞,以收集针对Web应用程序的攻击数据。 Kippo – 中交互性的SSH 蜜罐攻击器,用于记录暴力破解攻击。 Kojoney – 一种低…...
26页PDF | 数据中台能力框架及评估体系解读(限免下载)
一、前言 这份报告详细解读了数据中台的发展历程、核心概念、能力框架及成熟度评估体系。它从阿里巴巴的“大中台,小前台”战略出发,探讨了数据中台如何通过整合企业内部的数据资源和能力,加速业务迭代、降低成本,并推动业务增长…...
AI开发 - GPT之魂 用Python 演示chatGPT的自注意力机制 - 机器学习
自注意力机制(Self-Attention)就是让模型在处理每个词时,学会“关注重点”,而不是平均地对每个词一视同仁。这种机制让 GPT 能更聪明地理解句子的上下文和语义之间的关系。 自注意力机制是 GPT 的核心,它帮助模型在理解…...
Vue CLI 提供了哪些功能
前言 Vue CLI 为开发者提供了一整套强大且灵活的工具链,极大地提升了开发效率和代码质量。无论是创建项目、管理依赖、配置环境,还是进行测试和优化,Vue CLI 都能为你提供全面的支持。本文将深入探讨 Vue CLI 所提供的各种功能,并…...
网络爬虫的原理
网络爬虫就是根据网络,把上面的相关信息比如源代码以字符串的形式爬取下来,并且涉及到网站下的一系列网站。 DNS域名解析服务器可以通过ping域名/ip来测试是否连通,dns可以记录网站访问次数,从而评估出网站的使用权重,…...
02_Django路由Router
二、Django路由Router 在实际开发过程中,一个Django 项目会包含很多的 app ,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个 app 里,创建各自的urls.py路由模块,然后从根路由出发,…...
计算属性和监听属性
Vue.js 中的计算属性与监听属性 Vue.js 是一个流行的前端框架,它提供了许多强大的特性来简化 Web 应用的开发。其中,计算属性(Computed Properties)和监听属性(Watchers)是两个非常重要的概念,…...
JAVA项目-------医院挂号系统
1,项目目的 1、科室管理:新增科室,删除科室(如果有医生在,则不能删除该科室),修改科室。 2、医生管理:录入医生信息,以及科室信息。修改医生信息(主要是修改…...
《Learn Three.js》学习(3)光源
前言: WebGL本身不支持光源,不使用three.js,则需使用着色程序来模拟光源。 学习大纲: Three.js中的光源 特定光源的使用时机 如何调整和配置所有光源的行为 如何创建镜头光晕 光源表 基础光源:THRER.AmbientLight、THERE.Point…...
npm error code ETIMEDOUT 简单排查
今天突然没到一个仓库的ius问题。改完之后想发布npm包 出现下面的场景 npm addUser npm adduser npm notice Log in on https://registry.npmjs.org/ Create your account at: https://www.npmjs.com/login?next/login/cli/12596c8b-ba4a-4763-8a97-215087d380c4 Press ENTER…...
Flink高可用配置(HA)
从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…...
VITE+VUE3+TS环境搭建
前言(与搭建项目无关): 可以安装一个node管理工具,比如nvm,这样可以顺畅的切换vue2和vue3项目,以免出现项目跑不起来的窘境。我使用的nvm,当前node 22.11.0 目录 搭建项目 添加状态管理库&…...
windows上安装使用kubectl访问容器内服务
以云服务商提供的容器服务为例: 登录云服务,选择容器服务选择集群管理,选择集群概览点击kubeconfig按钮,进入说明页面官网下载kubectl 1、到 Kubernetes 版本变更 页面,查看 kubernetes 已发行版本,确认需要安装的 kubectl 版本。 2、kubectl 版本和集群的 kubernetes 版…...
软件工程第14章小测
单项选择题 第1题 定义类A和B Class A{ public B methodA(){...} } Class B{ public void methodB(){...} } 下面代码中的耦合是()。 Class Client{ public static void main(String args){ A oa new A(); a.methodA().methodB(); } } …...
HarmonyOS4+NEXT星河版入门与项目实战(23)------组件转场动画
文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、实现效果4、总结1、控件图解 这里我们用一张完整的图来汇整 组件转场动画的用法格式、属性和事件,如下所示: 2、案例实现 这里我们对上一节小鱼游戏进行改造,让小鱼在游戏开始的时候增加一个转场动画,让小鱼自…...
word转pdf
在线xml格式化: 在线 XML 格式化 | 菜鸟工具 Java使用FreeMarker自动生成Word文档(带图片和表单) Java使用FreeMarker自动生成Word文档(带图片和表单)_freemarker word模板-CSDN博客 将word转pdf JAVA 使用aspose…...
@bytemd/vue掘金markdown插件预览内容有误
vue项目使用bytemd/vue 来预览字符串格式的markdown内容,总会多出如图的一段代码, 请问有没有大佬知道为什么? 很急,求教!!!!!...
产品知识培训全面指南
在当今竞争激烈的市场环境中,产品知识已成为企业成功的关键因素。特别是对于软件即服务(SaaS)公司而言,产品的复杂性要求团队对产品有深入的了解,以便有效地与潜在客户沟通并促成交易。本指南将深入探讨产品知识培训的…...
VSCode修改资源管理器文件目录树缩进(VSCode目录结构、目录缩进、文件目录外观)workbench.tree.indent
文章目录 方法点击左下角小齿轮点击设置点击工作台,点击外观,找到Tree: Indent设置目录树的缩进 方法 点击左下角小齿轮 点击设置 点击工作台,点击外观,找到Tree: Indent设置目录树的缩进 "workbench.tree.indent"默认…...
周鸿祎再次“创业”,盯上百度
周鸿祎特地拍了部短剧来推广的新产品,终于上线了。 11月27日晚间,360正式发布多模态内容创作引擎“纳米搜索”。 作为当前AI应用最红的赛道之一,AI搜索已经有腾讯、秘塔、商汤、抖音等公司入局。传统搜索老大百度也在发力。竞争不妨碍有搜索…...
夜神模拟器+安卓7安装burpsuite系统证书
夜神模拟器安卓7安装burpsuite系统证书 安卓 7.0 以上安装 CA 证书: 安卓 5 所安装的 burp 证书是安装到系统根目录下的,从 Android 7.0 开始,系统不再信任用户 CA 证书,所以需要把 CA 证书安装到系统 CA 证书目录。 效果: 导出…...
TavilySearchResults报错
报错 pydantic_core._pydantic_core.ValidationError: 1 validation error for TavilySearchAPIWrapper Value error, Did not find tavily_api_key, please add an environment variable TAVILY_API_KEY which contains it, or pass tavily_api_key as a named parameter. …...
avcodec_alloc_context3,avcodec_open2,avcodec_free_context,avcodec_close
avcodec_alloc_context3 是创建编解码器上下文,需要使用 avcodec_free_context释放 需要使用avcodec_free_context 释放 /** * Allocate an AVCodecContext and set its fields to default values. The * resulting struct should be freed with avcodec_free_co…...
HttpClient
是apache旗下的项目 可以用来提供高效的 最新的 功能丰富的 支持HTTP协议的客户端编程工具包,并且支持HTTP协议最新的版本和建议 核心API HttpClient HttpClientsCloseableHttpClientHttpGetHttpPost 发送请求步骤 创建HttpClient对象创建Http请求对象调用H…...
Flink解决延迟数据问题
总结: 水印:对于迟到数据不长 allowedLateness: 迟到时间很长 侧道输出:对于迟到时间特别长 对于延迟数据的理解: 水印机制(水位线、watermark)机制可以帮助我们在短期延迟下,允许乱序数据的到来。 这个机制很好的…...
基于matlab程序实现人脸识别
1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…...
ESP32 wifi smartConfig 配网时密码错误导致一直死循环问题解决
项目场景 硬件:ESP32-LyraT-Mini V1.2开发板,使用的是ESP32-WROVER-E 模组。 程序:基于smart_config示例程序测试 问题描述 烧录程序后,debug打印“smartconfig_example: Scan done”信息后,打开手机app“EspTouch”进行配网,如果密码输入正确,正常的debug信息如下:…...
串口通讯介绍
详情学习 12. 串口通讯与终端设备 — [野火]嵌入式Linux基础与应用开发实战指南——基于i.MX6ULL开发板 文档 (embedfire.com) 问题 DB9接口 RS232,RS485 标准DB9接口(串口通信线标准接口)_485接口接线方法9针-CSDN博客 DB9 各引脚定义 1 DCD 载波检测 2 RX 接收数据…...
出于安全考虑,你的平板电脑已设置为禁止安装来源不明的应用,对于这种工业的安卓平板,应该怎么解决问题呢
在一些工业安卓平板上,出于安全考虑,通常会禁止安装来自未知来源的应用程序。这是为了防止恶意软件或不可信的应用程序被安装到设备上。为了绕过这个限制并安装来自未知来源的应用程序,你可以按照以下步骤进行操作: 1. 启用“未知…...
Java技术复习提升 15IO流
先给各位读者致歉 笔者因身体抱恙 未能及时更新 以后会按时更新 和大家一起学习探究~ 第15章 IO流 15.1 文件 文件就是保存数据的地方 文件流 15.2 常用文件操作 创建文件对象构造器和方法 import org.junit.Test;import java.io.File; import java.io.IOException;publ…...
Oracle 19C Data Guard 单实例1+1部署(Duplicate方式)
环境描述 项目主库备库操作系统CentOS 7.9CentOS 7.9数据库版本Oracle 19.3.0.0Oracle 19.3.0.0ORACLE_UNQNAMEhishisdgIP地址10.172.1.10110.172.1.102Hostnamehisdb01hisdb02SIDhishisdb_namehishisdb_unique_namehishisdg 说明 主库和备库建议采用相同服务器配置。主库和…...
网安小白的端口关闭实践
proceeding 扫描 $ nmap --top-ports 10000 10.162.8.227 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-29 17:07 CST Nmap scan report for star (10.162.8.227) Host is up (0.00023s latency). Not shown: 8367 closed tcp ports (conn-refused) PORT ST…...
微软要求 Windows Insider 用户试用备受争议的召回功能
拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall,这是一项臭名昭著的快照拍摄 AI 功能,在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示:“我们听…...
nginx反向代理、负载均衡
nginx反向代理、负载均衡 一、反向代理 proxy模块1、作用2、语法3、配置后端服务器记录真实的客户端地址 二、负载均衡 upstream模块2.1 负载均衡作用2.2 调度算法/策略2.3 配置语法 一、反向代理 proxy模块 1、作用 提升业务的性能、并发能力 隐藏后端真实业务服务器的信息&…...
mysql集群NDB方式部署
1. 基本信息 部署机器角色部署路径192.168.0.1管理节点部署目录: /alidata1/mysql-cluster-8.4.3192.168.0.2管理节点192.168.0.3数据/SQL节点数据目录:192.168.0.4数据/SQL节点/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd192.168.0.5数据节点 – 新增/alidata1/mysql-clust…...
Fabric.js 中文文档
Fabric.js 中文文档 基于canvas画布的实用类Fabric.js的使用 4、Fabric.js 常用的方法&事件 Fabric.js 画布 defaultCursor 属性(1) 官网文档地址:http://fabricjs.com/docs/github 地址:https://github.com/fabricjs/fabric.js Demo地址&#x…...
【面试重难点问题】c++中为什么可以函数重载,但是c语言中不可以
本文章是对于“c中为什么可以函数重载,但是c语言中不可以”这个问题的探究: 当然这是一个值得深入探讨的问题。在面对难题时,我们常常会竭尽全力寻找答案,不惜挖掘三尺以探究竟。面对上面这个问题时,理解计算机系统的…...