【Linux专栏】Linux进程间关系和守护进程
文章目录
- 1、进程间关系
- 1.1 进程组
- 1.2 组长进程
- 2、会话?
- 2.1 查看会话
- 2.2 创建会话
- 3、控制终端
- 4、作业控制
- 4.1 前台/后台进程
- 5、守护进程
- 5.1 如何创建守护进程?
- 5.2 杀掉守护进程
1、进程间关系
主要描述两个名称概念:即进程组和组长进程。
1.1 进程组
什么是进程组?通过名称可以看到它包含很多进程,所有进程在一个组内,当然名称虽然是进程组,其实在Linux中,单个进程也是有自己的组。首先,通过看一个进程在Linux中是如何描述的?
PPID:
表示该运行的进程所属的父进程ID信息,即该进程的父亲。
PID:
表示该运行进程的唯一标识符。
PGID:
表示改进程所属进程组的ID,(由于是单进程因此进程组ID就是自己的PID,也就是为什么说进程组中可以有一个进程。)
SID:
表示会话ID信息
TTY:
表示该进程所属于哪一个终端,(显示的是终端号,本质就是在/dev/pts下的一个文件)
UUID:
表示是哪一个用户执行的该进程,即用户名,只不过Linux中是用数字描述的。
我们看到描述一个进程的信息有PPID、PID、PGID等,接下来要讲述的就是PGID?
首先来看一个指令,该指令是由3个相同的指令组合,用管道连接的 ,我们知道在Linux中一条运行的指令就是一个进程。
从图中可以看到启动了3个进程,他们同属于一个组,因为PGID都是393911
,仔细观察看到该进程组ID就是第一个运行起来的进程PID。
总结就是:当多个进程在运行时候,他们有各自的PPID、PID,但是PGID是相同的,因为是一个进程组,并且规定进程组ID就是第一进程执行时的PID。
上面看到的是由多个进程组成的进程组,所描述的信息就是上面所展示的,那么只有一个进程运行的时候又是如何描述的?如下显示的:
上面就是单个进程运行时,他的进程组就是自己的PID,也符合:第一个进程运行的PID作为PGID。
看到多个进程和单个进程的进程组描述如上,那么当我们在一个进程中又创建了子进程,然后让父进程直接退出,此时进程又是如何描述的?如下:
可以看到当一开运行进程的时候,父进程在程序中设置的是延时5秒,此时进程有自己的PPID、PID、PGID,由于是单进程组成的进程组,所以是自己的PID,当5秒结束后,程序中紧接着创建子进程,并且让父进程直接退出,此时该进程就变为了孤儿进程,被1号进程领养,但所属的进程组ID是不变的,还是第一个进程运行的PID,只是PID变为了子进程的PID了。
总结:在多进程中实际上以进程组的关系执行的,进程组就是一个或多个进程的集合,一个进程组可以有多个进程,也可以只有一个进程。PGID就是第一运行进程的PID,同时只有当最后一个进程退了,该组才全部退出,与组长进程是否退出没有关系。
1.2 组长进程
通过上面的描述,显而易见组长进程就是在进程组中第一个运行的进程,对应的PGID就是该进程的PID。
查看对应列属性的数据指令:ps -eo 对应进程列属性
2、会话?
会话和上面的进程组有关系,即在一个会话中可以包含一个或者多个进程组,因此一个或多个进程组集合就是一个会话。
2.1 查看会话
通过上面的图可以看出,每创建一个终端登录界面,登录后就会有对应的SID,因此会话就可以理解为从用户登录该终端开始到该终端退出关闭,在该过程中所操作的所有事。通过SID,即会话ID来区分不同会话区。
2.2 创建会话
在看到会话所表示的区域后,我们自己如何创建新的会话呢?
即通过setseid
函数创建会话。该函数使用前提就是不能让组长进程来创建会话。
#include <unistd.h>
/*
*功能:创建会话
*返回值:创建成功返回 SID, 失败返回-1 */
pid_t setsid(void);
为了不让创建的进程是组长进程,通常是在进程中创建子进程来创建会话。
3、控制终端
简单来说,控制终端就是用户在通过终端登录系统过后得到的一个shell进程,登陆后所在的终端就是该shell的控制终端。控制终端保存在PCB中的,因此在shell中启动的所有进程都属于该登录的终端。 每个进程的标准输入、输出、错误都会指向该控制终端。在理解控制终端后,它还和会话、进程组有这些关系:
①一个会话拥有一个控制终端,通常打开的首个会话进程打开终端后,该终端就是该会话的控制终端。
②和控制终端建立的会话的首进程叫控制进程。
③在一个会话中的多个进程组中可以被分为一个前台进程组和一个或多个后台进程组。控制终端的指令只能发送给前台进程组。
4、作业控制
什么是作业?每个学生都知道作业这件事,但这里的作业是指用户为了完成某件事而启动的进程。一个作业可以包含一个进程或者是进程组,进程之间相互协调。
作业控制?
谁控制?在Shell中分前后台来控制,控制的就是作业或者是进程组。一个前台作业可以是多个进程组,后台也可以是多个。Shell可以同时运行一个前台作业或多个作业前台作业,即为作业控制。
4.1 前台/后台进程
我们用户输入执行程序指令时大多数都是前台运行的,前台运行有个特点就是只有等前台运行结束后用户再输入指令才有用,才会被控制终端接收。
./exe:
该方式运行的就是前台进程。
变为后台进程方式:./exe &
在同一个会话中,可以允许多个后台进程(组),但前台进程(组)只允许一个。
前后台进程的标志:看谁应该从标准输入中获取数据。明确的是只有前台进程才可以获取。
把后台变为前台:fg 进程名
,也可以通过作业号进行移动。
前台变为后台:先停止前台进程(ctrl+z),在bg 进程名
5、守护进程
守护进程不受控制终端关闭的影响,而是长时间运行的。我们就是把在会话的中的进程组拿出来放在单独的放到独立的会话中,此时该进程组就是守护进程。
那么如何创建会话,前面说了通过setsid()
函数,注意不能是组长进程。
既然不能是组长进程,我们在写程序的时候,主函数中就是父进程,第一个先运行的,即为组长进程,因此不能在主函数中创建会话,需要在子进程中创建会话。让父进程直接退出。此时就会想到孤儿进程,因此守护进程就是孤儿进程的一种特殊。
5.1 如何创建守护进程?
步骤:
①忽略信号。
②创建子进程,在其中创建会话。
③更改工作目录。
④重定向标准输入输出到/dev/null。
#pragma once#include<iostream>
#include<string>
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>//更改工作目录
const char *root="/";//根目录
const char *dev_null="/dev/null";void Demo(bool isChdir,bool isClose)
{//1、忽略可能引起程序错误的信号signal(SIGCHLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);//2、创建子进程if(fork()>0){exit(0);//父进程退出}//3、子进程中创建会话setsid();//4、查看是否更改CWDif(isChdir){chdir(root);//更改为根目录}//5、此时已经是守护进程了,不需要和用户的标准输入、输出、错误关联if(isClose){close(0);close(1);close(2);}else{//也可以重定向int fd=open(dev_null,O_RDWR);if(fd>0){//后者重定向到前者dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}}
}
通过调用编写的函数,把进程变为守护进程
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include "Demo.hpp"
int main()
{// sleep(5);// if(fork()>0)// {// exit(1);// }// while(1)// {// std::cout<<"child PPID:"<<getppid()<<" PID:"<<getpid()<<std::endl;// sleep(1);// }//Demo(false, false);while (1){std::cout << "hello" << std::endl;sleep(1);}return 0;
}
5.2 杀掉守护进程
kill -9 PID
相关文章:
【Linux专栏】Linux进程间关系和守护进程
文章目录 1、进程间关系1.1 进程组1.2 组长进程 2、会话?2.1 查看会话2.2 创建会话 3、控制终端4、作业控制4.1 前台/后台进程 5、守护进程5.1 如何创建守护进程?5.2 杀掉守护进程 1、进程间关系 主要描述两个名称概念:即进程组和组长进程。…...
AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比
AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比 核心功能对比 特性PostgreSQL AutoVACUUMOracle GATHER_DATABASE_STATS_JOB_PROC主要目的空间回收 统计信息更新仅优化器统计信息收集底层机制MVCC(多版本并发控制)维护CBO(基于成本的…...
go依赖查询工具之godepgraph(分析main.go的依赖树)
文章目录 go依赖查询工具之godepgraph(分析main.go的依赖树)什么是服务间的隐式耦合?分析main.go的依赖树方法1. godepgraph (配合 Graphviz 可视化) - 最直观【推荐】方法2. go list go依赖查询工具之godepgraph(分析main.go的依…...
市场差分探头信号输出形式的一些因素考量
在5G/6G通信、新能源汽车电控等高频测量场景中,差分探头的信号输出架构直接影响测试系统的信噪比与可靠性。根据IEEE仪器与测量协会2024年度报告,单端输出方案的市场渗透率较2020年提升42%,这一趋势背后蕴含着深刻的技术变革逻辑。 一、核心…...
SQL练习——day01
力扣——SQL练习总结 DENSE_RANK()窗口函数 这是排名函数的一种,它在处理相同值时,会给相同的值分配相同的排名,并且后续的排名不会跳过。比如有三个分数并列第一,那么它们的排名都是 1,接下来的分数排名就是 2&#…...
断点续传使用场景,完整前后端实现示例,包括上传,下载,验证
断点续传在多个场景中非常有用,包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来,我将为你提供一个基于Java的后端实现示例,结合前端逻辑来完成整个断点续传的功能,包括上传、…...
Xinference推理框架
概述 GitHub,官方文档。 核心优势 性能优化:通过vLLM、SGLang等引擎实现低延迟推理,吞吐量提升2-3倍;企业级支持:支持分布式部署、国产硬件适配及模型全生命周期管理;生态兼容:无缝对接LangC…...
技术更新频繁,团队如何适应变化
构建持续学习机制、引入技术雷达与预研机制、通过敏捷方法快速响应变化、推动跨团队知识协作与传承 是应对技术更新频繁、团队保持适应力的核心策略。其中,构建持续学习机制尤为关键。通过制度化、场景化的学习安排,团队可以主动追踪新技术趋势ÿ…...
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析 我们首先来看一下 整个MCP的一个基本的一个流程,他解决的一个问题。我们回到这里,他解决的一个问题是什么呢?他解决这个问题就是你的大…...
游戏代码混淆的作用与应用分析
1. 防止逆向工程 核心保护对象:游戏引擎、算法(如物理模拟、AI行为树)、加密逻辑等。实例:Unity游戏使用 ConfuserEx 混淆C#代码,使反编译工具(如dnSpy)只能显示杂乱命名,难以理解逻…...
信息系统运行管理员:临阵磨枪版
信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料,力求完整覆盖考点细节) 第一部分:基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息: 含义:香农 - 减少随机不确定性的东西;…...
PWM(脉宽调制)的配置参数[预分频器\自动重载值]的自动计算
文章目录 前言一、数据结构二、二分法搜索最佳预分频器和自动重载值三、示例 前言 pwm是嵌入式开发过程中很常见的一个模块,而配置pwm的过程中就少不了频率参数的计算,大多数32位机的pwm频率都由时钟、预分频器(prescaler)、自动…...
manuskript开源程序是面向作家的开源工具
一、软件介绍 文末提供程序和源码下载 manuskript开源程序是面向作家的开源工具,Manuskript 可在 GNU/Linux、Mac OS X 和 Windows 上运行。 二、Features 特征 Manuskript provides a rich environment to help writers create their first draft and then furt…...
antd 主题色定制
定制方案: 1. 全局定制 整个应用范围内的组件都生效 全局文件 theme.css :root:root {--adm-color-primary: #a062d4; } antd-mobile 中的主题变量也是在 :root 下声明的,所以在有些情况会由于优先级的问题无法覆盖。通过 :root:root 显式地让你所…...
召回11:地理位置召回、作者召回、缓存召回
GeoHash 召回 属于地理位置召回,用户可能对附近发生的事情感兴趣。GeoHash 是一种对经纬度的编码,地图上每个单位矩形的 GeoHash 的前几位是相同的,GeoHash 编码截取前几位后,将相同编码发布的内容按时间顺序(先是时间…...
leetcode0767. 重构字符串-medium
1 题目:重构字符串 官方标定难度:中 给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行,返回空字符串 “” 。 示例 1: 输入: s “aab” 输出: “…...
vue基本介绍
Vue是一款流行的JavaScript前端框架,以下是其基本介绍: 发展历程 - 2014年,尤雨溪发布了Vue的第一个版本。 - 此后,Vue不断发展和完善,陆续发布了多个版本,功能逐渐强大,社区也日益活跃。 …...
【vue】【环境配置】项目无法npm run serve,显示node版本过低
解决方案:安装高版本node,并且启用高版本node 步骤: 1、查看当前版本 node -v2、配置nvm下载镜像源 1)查看配置文件位置 npm root2)找到settings.txt文件 修改镜像源为: node_mirror: https://npmmirro…...
第35周Zookkeeper+Dubbo JDK不同版本介绍
一、JDK 新特性全解析 JDK9 - 模块化:化繁为简的魔法 模块化特性:JDK9 给 Java 程序带来模块化特性,就像把一个大公司划分成多个部门,每个部门(模块)各司其职。模块比包更大,一个模块包含多个…...
【ORB-SLAM3】CreateNewKeyFrame()函数阅读
void Tracking::CreateNewKeyFrame() void Tracking::CreateNewKeyFrame() {// 如果局部建图线程正在初始化且没做完或关闭了,就无法插入关键帧if(mpLocalMapper->IsInitializing() && !mpAtlas->isImuInitialized())return;if(!mpLocalMapper->SetNotStop(t…...
腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~
简介 VITA-Audio 是一个由腾讯优图实验室(Tencent Youtu Lab)、南京大学和厦门大学的研究人员共同开发的项目,旨在解决现有语音模型在流式生成(streaming)场景下生成第一个音频令牌(token)时的高…...
使用 TypeScript + dhtmlx-gantt 在 Next.js 中实现
1. 安装依赖(确保已安装) npm install dhtmlx-gantt2. 创建 pages/gantt.tsx use clientimport { useRef, useEffect } from react import { gantt } from dhtmlx-gantt import dhtmlx-gantt/codebase/dhtmlxgantt.cssinterface Task {id: number | st…...
web第四次课后作业--页面操作实现数据库的增删查改
一、环境配置 1. 创建一个java web(maven构建)的项目2. 配置tomcat3. 连接数据库二、页面呈现 登录页面 详细信息 删除一条信息后 更新 更新后的信息 三、目录结构 四、代码实现 4.1 denglu.jsp <% page language"java" cont…...
DeepSearch:字节新一代 DeerFlow 框架
项目地址:https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架构设计】独家设计的 Research Team 机制,支持多轮对话、多轮决策和多轮任务执行。与 LangChain 原版 Supervisor 相比,显著减少 Tokens 消耗和 API 调用次数&#…...
uniapp中vue3和pinia安装依赖npm install失败
目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 用uni-app开发小程序的时候,使用了vue3pinia,安装依赖的时候发现vue和pinia的版本问题,安装失败, npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…...
【java】synchronized关键字详解
目录 一、线程同步与线程安全问题线程不安全Demo线程不安全的原因 二、synchronized关键字关键字锁粒度修饰对象修饰代码块修饰方法修饰静态方法修饰类 synchronized 锁总结 synchronized加锁原理MarkWordsynchronized锁升级synchronized锁原理synchronized关键字总结 其他同步…...
使用 `perf` 和火焰图(Flame Graph)进行性能分析
在现代软件开发中,性能优化是提升应用程序响应速度和资源利用率的关键步骤。当一个进程的 CPU 占用率异常高时,识别并优化性能瓶颈显得尤为重要。本文将详细介绍如何使用 Linux 下强大的性能分析工具 perf 以及火焰图(Flame Graph)…...
Cocos Creator 3.8.5 构建依赖环境配置文档
Cocos Creator 3.8.5 构建依赖环境配置文档 文章目录 Cocos Creator 3.8.5 构建依赖环境配置文档✅ 构建依赖汇总表✅ 构建平台配置说明👉 Windows 构建👉 Android 构建 ✅ 推荐构建环境组合(稳定)✅ 常见问题提示 适用于打包 An…...
# FlyEnv 环境下 MySQL 操作全攻略:从基础到字段修改
在使用 FlyEnv 搭建开发环境时,MySQL 数据库的操作是开发过程中不可或缺的一环。无论是修改字段结构,还是执行其他常见操作,都需要熟练掌握相关技能。下面将为你详细介绍 FlyEnv 环境下 MySQL 的操作,以及修改字段的多种方法。 一…...
C语言_自动义类型:联合和枚举
1. 联合体 1.1 联合体类型的声明 与结构体相似,联合体也是有一个或多个成员(可以是不同类型)构成;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间,所以联合体也叫ÿ…...
Golang基础知识—cond
cond 通常指 sync.Cond,它是标准库 sync 包中用于实现 条件变量 的同步原语。条件变量在多 goroutine 协作场景中非常有用,尤其在需要根据特定条件协调多个 goroutine 的执行顺序时。 sync.Cond 的核心作用 条件变量用于 等待某个条件满足 或 通知其他等…...
深入探索向量数据库:构建智能应用的新基础
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
实验5 DNS协议分析与测量
实验5 DNS协议分析与测量 1、实验目的 了解互联网的域名结构、域名系统DNS及其域名服务器的基本概念 熟悉DNS协议及其报文基本组成、DNS域名解析原理 掌握常用DNS测量工具dig使用方法和DNS测量的基本技术 2、实验环境 硬件要求:阿里云云主机ECS 一台。 软件要…...
1200/1500 PID 学习笔记
一 准备 1. 仿真库文件,下载链接放在最后 2.PID仿真,不支持1200.所以组CPU需要1500. 3.PID必须在循环中断里面调用。 二 试水 1. 拉一个PID指令 2. 库文件拉入 3 仿真试水,可以看到已经开始调节了。 、 三 组态设置 1. Input: 输入值&a…...
深度学习中--模型调试与可视化
第一部分:损失函数与准确率的监控(Loss / Accuracy Curve) 1. 为什么要监控 Loss 与 Accuracy? Loss 是模型优化的依据,但它可能下降了 Accuracy 反而没变(过拟合信号) Accuracy 才是评估效果的…...
tomcat项目重构踩坑易错点
是的,没错,弄了一个特别老的项目。重构真是头疼啊。其实好吧,还是用的太少。 前提条件:用idea工具非社区版。注意是非社区版。点击设置- project Structure 1.配置Modules 点击import module 添加好模块后。 重点来了࿰…...
如何安全擦除 SSD 上的可用空间
无论您是要处理旧 SSD 还是只是想确保敏感信息的私密性,擦除可用空间都是至关重要的一步。那么,您可以擦除 SSD 上的可用空间吗?是的,可以擦除 SSD 上的可用空间,我们在本指南中提供了两种有效的方法。是的,…...
增强 HTNN 服务网格功能:基于 Istio 的BasicAuth 与 ACL 插件开发实战
目录 1.引言 什么是HTNN? 为什么开发 BasicAuth 和 ACL 插件? 2.技术背景 技术栈概览 Istio 与服务网格简述 HTNN 框架与插件机制概览 3.插件开发详解:BasicAuth 与 ACL 3.1 BasicAuth插件 功能点 实现细节 3.2 ACL插件 功能点 …...
从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例
产品部门定义了一个如下概念性的“知识奇点工程师”,他们构建的不仅仅是一个数据库或知识图谱,而是一个活的、能自我进化的知识生态系统,是整个“Neuralink for Education”宏伟蓝图的基石。他们的工作难度和重要性,不亚于为AI引擎…...
docker(四)使用篇一:docker 镜像仓库
前文我们已经介绍了 docker 并安装了 docker,下面我们将正式步入使用环节,本章是第一个使用教学:docker 镜像仓库。 一、什么是镜像仓库 所谓镜像仓库,其实就是负责存储、管理和分发镜像的仓库,并且建立了仓库的索引…...
S7-1500 与 IM60 进行 PROFINET 通信
S7-1500 与 IM60 进行 PROFINET 通信 本文档介绍使用 S7-1500 CPU 与 IM 60 进行 PROFINET 通信,实现对 IM60 及 AM03 的控制。 使用软件及硬件 软件:工控人加入PLC工业自动化精英社群 TIA Portal V19 ET 200 SMART IM60 GSD 文件下载链接ÿ…...
车载诊断架构 ---车载总线对于功能寻址的处理策略
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
观QFramework框架底层逻辑有感
拿QFramework(以下简称QF)第一个案例简单理解框架底层代码逻辑。 使用QF框架重构后的代码,给我这种小白一种很抽象的感觉,但好的代码就是抽象的,这是不可否认的。于是想掌握一下这个框架的基础部分,至少能…...
ExecutorService详解:Java 17线程池管理从零到一
简介 在现代高并发应用中,线程池管理已成为提升系统性能与稳定性的关键核心技术。ExecutorService作为Java并发编程的核心接口,提供了对线程池的强大抽象与管理能力,相比直接管理线程,它能显著降低资源消耗、提高响应速度并增强系统可维护性。随着Java 17的发布,线程池管…...
Go 中闭包的常见使用场景
在 Go 中,闭包(Closure) 是一个函数值,它引用了其定义时所在作用域中的变量。也就是说,闭包可以访问并修改外部作用域中的变量。 Go 中闭包的常见使用场景 ✅ 1. 封装状态(无须结构体) 闭包可…...
养生:打造健康生活的四大支柱
饮食养生:吃对食物,滋养生命根基 饮食是健康的物质基础,需遵循 “均衡、天然、顺应时节” 原则: 三餐科学搭配: 早餐以高蛋白 膳食纤维为主,如燕麦粥配水煮蛋、蓝莓,快速激活代谢;…...
OpenCV 图像直方图:从原理剖析到实战应用
在数字图像处理领域,图像直方图是一种强大而基础的工具,它以直观的方式展示了图像中像素值的分布情况。OpenCV 作为广泛应用的计算机视觉库,提供了丰富的函数来处理图像直方图。本文将深入讲解图像直方图的原理、OpenCV 中的实现方法…...
springboot+vue实现在线书店(图书商城)系统
今天教大家如何设计一个图书商城 , 基于目前主流的技术:前端vue,后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统,需要有商品中心,库存中心,订单…...
LLM Text2SQL NL2SQL 实战总结
目录 尽量全面的描述表的功能 尽量全面的描述字段的功能 适当放弃意义等价的字段 放弃业务上无用的字段 对于LLM来说,由于它没有什么行业经验,所以我们需要尽可能的给予它恰当的“背景信息”,才能使它更好的工作。所谓恰当,不是越多越好,因为太多的信息会消耗掉LLM的可…...
SQLPub:一个提供AI助手的免费MySQL数据库服务
给大家介绍一个免费的 MySQL 在线数据库环境:SQLPub。它提供了最新版本的 MySQL 服务器测试服务,可以方便开发者和测试人员验证数据库功能,也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址: https://sqlpub.com/ SQLP…...