Linux操作系统——数据库
数据库
sun
solaris gnu
1、分类: 大型 中型 小型
ORACLE MYSQL/MSSQL SQLITE DBII powdb
关系型数据库
2、名词:
DB 数据库 select update database
DBMS 数据库管理系统
MIS 管理信息系统
OA 办公自动化
3、嵌入式数据库:
sqlite3 www.sqlite.org www.kernal.org
GNU
特点:
1、开源 C语言开发
2、代码量少 1万行左右,总大小10M以内
3、绿色软件无需安装
4、文件型数据库,可以移动。
5、数据容量最大 2T
whereis sqlite3
sqlite3:
4、sqlite3的安装: LTS long term support
1、在线安装 :
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
gcc test.c -lsqlite3 -lpthread
2、验证是否安装成功:
sqlite3 --version
sqlite3 --help
5、sqlite3的使用:
0、启动sqlite3
sqlite3 xxx.db
===>用sqlite3 来打开一个名称为test.db的本地数据库。
出现如下提示符:表明数据库管理系统启动。
sqlite>
退出数据库:
.q 命令
注意:如果一直出现如下符号:
...>
则写';'结束。
以下所有命令必须在 sqlite> 后执行。
创建一个数据库:
1、touch xxx.db
2、sqlite3 xxx.db
1、系统维护命令:===> .help
出现所有相关的系统维护命令,都是以 "."开头。
.database 列出当前库和系统中那个文件在关联
.tables 列出当期数据库中的所有表
.schema xxx 列出当前指定的xxx表结构
.dump user ===>导出数据库
重定向
sqlite3 test.db .dump > 123.sql
sqlite3 xxx.db < test.sql ===>导入数据库
2、标准SQL语句:===》通用语法在其他平台可以直接使用。struct query language;
注意:所有的sql语句都以';'结尾。
创建一个表:ddl
create table 表名(表字段1,表字段2,...);
eg: create table user(id,name,age); char (有长度限制)字符串
注意:以上表的表字段,支持如下数据类型。int text real blob(照片)
默认是text类型。char;
create table 表名 (表字段 类型,表字段 类型,。。。。);
eg:
create table user(id int ,name char,age int);
删除一个表:
drop table 表名;
eg:drop table user;
数据库常规操作: 增加 删除 修改 查询
向表中增加数据:
insert into 表名 (字段名称 ) values (值名称);
eg:insert into user (id,age) values (1,10);
insert into user values(3,"wang",11);
insert into user (age) values ( 12);
查询表中的数据:
select 列名 from 表名 条件;
eg:select * from user ; 查询有多少列
select id from user;只取某几列:
select id,name from user where not age <30
where name like '三一' % _ 通配符
查询创建的表中是什么类型 : .schema
要是想在查询的列最上面显示类型: .headers on
asc
select *from user where age>20 or age<50 order by age desc limit 2 ;
&& ||


用like 查询通配符,=查看具体哪个re'e
%和_是0到任意多个字符 通配符
修改表中数据:
update 表名 set 表字段 = 值 满足条件:
eg: update user set id = 1 where name = 'li';
update user set id = 1 where name = "li" and passwd = "123";
update user set id = 2 where name = "li" or name = "zhao";

删除表中数据:
delete from 表名 满足条件:
eg:delete from user ; ///删除表中所有数据
delete from user where id = 1; ///删除id=1 的数据;
delete from user where id =1 and name = "zhang";
delete from user where id = 1 or id = 2;

>2022-1-1 and <2018-12-31
插入时间列 int int;
unicode
CREATE TABLE user1(id int,name char,age int,dt datetime);
、'2022-07-01 19:00:00'
insert into user1 values (2,'张三',23,datetime('now','+8 hours'));

自动增长列
sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime); 主键
sqlite> insert into user3 (NULL,'李四',23,datetime('now')); (void*)0
asc
where (group by having) order by [desc] limit;
select * from user where id<10 order by id limit 2;
维护命令:
1、数据的导出:
sqlite3 xxx.db .dump > xxx.sql
//将数据库名称为xxx的数据库整体导出到脚本中。
“>”输出重定向
2、数据的导入:
sqlite3 xxx.db < xxx.sql
“<”输出重定向
3、可视化工具安装:s
sudo apt-get install sqlitebrowser
==================================================
sqlite3 数据库编程接口:
1、需要的头文件
sqlite3.h
2、编译过程
-lsqlite3
3、编程框架:
打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库
sqlite3.h
3.1 打开数据库: sqlite3_open
int sqlite3_open(char * path,sqlite3 ** db);
功能:打开指定path路径+文件名称的数据库,并将
打开的地址指向db变量的句柄。
参数:path 要打开的数据库路径+名称
db 要打开的数据库地址指针
返回值:成功 0
失败 -1;

3.2 关闭数据库: sqlite3_close
int sqlite3_close(sqlite3 *db);
功能:关闭指定的数据库
参数:要关闭的数据库地址
返回值:成功 0
失败 -1;

3.3 数据库操作:
查询操作:sqlite3_get_table(); select
int sqlite3_get_table(sqlite3 *db,char *sql,
char *** rest,int *nrow,int *ncol,
char ** errmsg);
功能:在db数据库上执行sql查询语句,并将执行的
结果集返回到rest地址上,同时返回查询的行和列。
参数:db 要执行查询语句的数据库
sql 要执行的select查询语句
rest 查询的结果集是一个三级指针
nrow 查询的结果的行数
ncol 查询的结果的列数
errmsg 如果执行有错误,则存储错误。
返回值:成功 0
失败 非0;
执行sql语句:sqlite3_exec(); insert delete update
int sqlite3_exec(sqlite3 *db,char *sql,callback fun,
void * arg,char ** errmsg);
功能:在db数据库上执行sql 非查询语句。
并将结果返回。
参数:db 要执行sql的数据库
sql 要执行的非查询sql语句。
fun 如果该函数要执行查询语句,则该回调函数
用来回收查询的结果。
arg 回调函数的参数,如果没有回调函数则该参数为NULL;
errmsg 执行过程中的错误信息。
返回值:执行成功 0
失败 非0 ;

int fun(void *arg ,int f_num,char ** f_value,
char ** f_name)
功能:该函数用于sqlite3_exec执行select语句的
结果集返回数据。
参数:arg 由sqlite3_exec传入的参数
f_num 执行该命令所返回测结果集的字段个数。
f_value 查询结果集中的字段的值。
f_name 查询结果集中的字段的名称。
返回值:成功 0
失败 非0
注意:该回调函数必须有返回值,否则可能导致查询异常。
#include <stdio.h> // 引入标准输入输出库
#include <stdlib.h> // 引入标准库,用于动态内存分配、程序控制等
#include <sqlite3.h> // 引入SQLite3库的头文件 int main(int argc, char *argv[])
{ sqlite3* db; // 声明一个指向sqlite3结构体的指针,用于存储数据库连接 // 尝试打开数据库文件aaa.db,如果文件不存在则创建它 // sqlite3_open的第二个参数是指向sqlite3*的指针的地址,用于存储数据库连接 int ret = sqlite3_open("aaa.db",&db); if(SQLITE_OK != ret) // 如果打开失败 { // 使用sqlite3_errmsg获取错误信息,并打印到标准错误输出 fprintf(stderr,"open db error:%s\n",sqlite3_errmsg(db)); // 无论成功与否,都需要关闭数据库连接 sqlite3_close(db); // 返回错误代码1表示程序异常退出 return 1; } // 准备要执行的SQL命令,这里是一个插入命令 char sql_cmd[256]="insert into user values(8,'zhaosi',12);"; // 声明一个用于接收SQL执行后可能产生的错误信息的指针 char * errmsg; // 执行SQL命令 // sqlite3_exec的第四个参数和第五个参数是回调函数和数据指针,这里都不需要,所以设为NULL // 第五个参数是指向错误信息的指针的地址,用于接收可能产生的错误信息 ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg); if(SQLITE_OK != ret) // 如果执行失败 { // 打印错误信息到标准错误输出 fprintf(stderr,"exec sqlcmd error:%s\n",errmsg); // 使用sqlite3_free释放sqlite3_exec分配的错误信息内存 sqlite3_free(errmsg); // 关闭数据库连接 sqlite3_close(db); // 返回错误代码1表示程序异常退出 return 1; } // 如果一切顺利,则关闭数据库连接 sqlite3_close(db); // 程序正常退出 return 0;
}
练习:自己创建一个学生表,最少不能低于3个字段
最好有一个唯一主键,
设计程序以代码方式,依次输入5个学生信息
并存储到数据库中,最终查询显示所有学习信息。
id(主键,自动),name,age,addr,datetime,recommand;
至少插入5条记录。
修改3处。
删除2条记录。
给数据库表添加主键:
1、sqliteman 设计表过程中选择 ;PK INTER
2、SQL 语句:
create table user(id int primary key,name text);
新建表
create table stu_info(id int ,name char ,age int ,phone char ,email char,qq char);
增加记录
insert into stu_info values (2,'关二哥',55,'13011112222','gauanerge@163.com','8888888');
查询记录
select * from stu_info;
修改记录
update stu_info set age = 56
where id = 2;
删除
delete from stu_info where id = 2;
select*from 表明 where
从句where
(id int,name char,age int,kind int,salary real);
insert into person values(9,'周瑜',39,3,3638.20);

ldd查看使用了哪些库
,该代码段使用SQLite3库来查询并打印user表中的数据、
#include <stdio.h> // 引入标准输入输出库
#include <stdlib.h> // 引入标准库(虽然在这段代码中未直接使用,但通常是C程序的标准包含之一)
#include <sqlite3.h> // 引入SQLite3库的头文件 // 定义一个回调函数,用于处理sqlite3_exec查询结果的每一行
// 参数arg是传递给sqlite3_exec的第四个参数(这里未使用,设为NULL)
// col是结果集中的列数
// result是一个指向字符串数组的指针,每个字符串都是结果集中的一列
// title是一个指向列名数组的指针(注意:在某些版本的SQLite中,title可能不是所有情况下都可用)
int show(void* arg, int col, char** result, char** title) { int i = 0; static int flag = 0; // 静态变量,用于控制列标题只打印一次 if (0 == flag) { // 打印列标题(如果存在的话) // 注意:title在某些版本的SQLite或某些配置下可能不是有效的,具体取决于编译的SQLite版本和设置 for (i = 0; i < col; i++) { if (title && title[i]) { // 检查title是否为NULL以及当前列名是否为NULL printf("%s\t", title[i]); } else { // 如果title不可用,可以选择不打印标题或使用占位符 printf("Column%d\t", i + 1); } } printf("\n"); flag = 1; // 设置标志位,避免重复打印标题 } // 打印结果集的每一行数据 for (i = 0; i < col; i++) { printf("%s\t", result[i] ? result[i] : "NULL"); // 如果结果为NULL,则打印"NULL" } printf("\n"); return 0; // 回调函数返回0表示成功
} int main(int argc, char *argv[]) { sqlite3* db; // 声明一个指向sqlite3结构体的指针,用于存储数据库连接 int ret = sqlite3_open("aaa.db", &db); // 尝试打开数据库文件aaa.db if (SQLITE_OK != ret) { // 如果打开失败 fprintf(stderr, "open db error:%s\n", sqlite3_errmsg(db)); // 打印错误信息 sqlite3_close(db); // 关闭数据库连接(尽管在错误情况下这可能不是必须的,但是一个好习惯) return 1; // 返回错误代码1表示程序异常退出 } char sql_cmd[256] = "select * from user;"; // 准备SQL查询命令 char *errmsg; // 声明一个用于接收SQL执行后可能产生的错误信息的指针 ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg); // 执行SQL查询,并注册回调函数show来处理结果 if (SQLITE_OK != ret) { // 如果执行失败 fprintf(stderr, "exec sqlcmd error:%s\n", errmsg); // 打印错误信息 sqlite3_free(errmsg); // 释放sqlite3_exec分配的错误信息内存 sqlite3_close(db); // 关闭数据库连接 return 1; // 返回错误代码1表示程序异常退出 } sqlite3_close(db); // 正常情况下也关闭数据库连接 return 0; // 程序正常退出
}
在C语言中使用SQLite3库来查询数据库并打印结果
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> // 回调函数,用于处理查询结果的每一行
int show(void* arg, int col, char** result, char** title) { int i = 0; static int flag = 0; // 静态变量,用于控制列标题只打印一次 if (0 == flag) { // 如果flag为0,则打印列标题 for (i = 0; i < col; i++) { // 注意:title可能为NULL或包含空字符串,这里直接打印 printf("%s\t", title ? title[i] : "Column?"); } printf("\n"); flag = 1; // 设置flag为1,避免再次打印列标题 } // 打印当前行的数据 for (i = 0; i < col; i++) { // 注意:result[i]也可能为NULL,这里直接打印(如果为NULL,则打印空字符串) printf("%s\t", result[i] ? result[i] : ""); } printf("\n"); return 0; // 回调函数返回0表示成功
} int main(int argc, char *argv[]) { sqlite3* db; // 指向SQLite数据库连接的指针 int ret = sqlite3_open("aaa.db", &db); // 尝试打开数据库 if (SQLITE_OK != ret) { // 如果打开失败 // 打印错误信息并关闭数据库(尽管在错误情况下关闭可能不是必需的,但这是一个好习惯) fprintf(stderr, "open db error:%s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; // 返回错误代码 } char sql_cmd[256] = "select * from user;"; // 准备SQL查询语句 char *errmsg; // 用于接收可能的错误信息的指针 ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg); // 执行SQL查询并注册回调函数 if (SQLITE_OK != ret) { // 如果执行失败 // 打印错误信息,释放错误信息占用的内存,并关闭数据库 fprintf(stderr, "exec sqlcmd error:%s\n", errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; // 返回错误代码 } // 查询成功完成,关闭数据库连接 sqlite3_close(db); return 0; // 程序正常退出
}
相关文章:
Linux操作系统——数据库
数据库 sun solaris gnu 1、分类: 大型 中型 小型 ORACLE MYSQL/MSSQL SQLITE DBII powdb 关系型数据库 2、名词: DB 数据库 select update database DBMS 数据…...
【数据结构与算法】希尔排序:基于插入排序的高效排序算法
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 目录 一、引言 二、基本原理 三、实现步骤 四、C语言实现 五、性能分析 1. 时间复杂度…...
关于正点原子的alpha开发板的启动函数(汇编,自己的认识)
我傻逼了,这里的注释还是不要用; 全部换成 /* */ 这里就分为两块,一部分是复位中断部分,第二部分就是IRQ部分(中断部分最重要) 我就围绕着两部分来展开我的认识 首先声明全局 .global_start 在 ARM 架…...
Deep Layer Aggregation【方法部分解读】
摘要: 视觉识别需要跨越从低到高的层次、从小到大的尺度以及从精细到粗略的分辨率的丰富表示。即使卷积网络的特征层次很深,单独的一层信息也不足够:复合和聚合这些表示可以改进对“是什么”和“在哪里”的推断。架构上的努力正在探索网络骨干的许多维度,设计更深或更宽的架…...
大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】
大数据面试SQL题复习思路一网打尽!(文档见评论区)_哔哩哔哩_bilibiliHive SQL 大厂必考常用窗口函数及相关面试题 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】大数据面试SQL题-笔记02【...】 目录 01、力扣网-sql题 1、高频SQL50题(…...
零基础自学爬虫技术该从哪里开始入手?
零基础自学爬虫技术可以从以下几个方面入手: 一、学习基础编程语言 Python 是爬虫开发的首选语言,因此首先需要学习 Python 编程语言的基础知识。这包括: 语法基础:学习 Python 的基本语法,如变量定义、数据类型、控…...
CV11_模型部署pytorch转ONNX
如果自己的模型中的一些算子,ONNX内部没有,那么需要自己去实现。 1.1 配置环境 安装ONNX pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple 安装推理引擎ONNX Runtime pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/si…...
Redis的使用(四)常见使用场景-缓存使用技巧
1.绪论 redis本质上就是一个缓存框架,所以我们需要研究如何使用redis来缓存数据,并且如何解决缓存中的常见问题,缓存穿透,缓存击穿,缓存雪崩,以及如何来解决缓存一致性问题。 2.缓存的优缺点 2.1 缓存的…...
BERT架构的深入解析
BERT(Bidirectional Encoder Representations from Transformers)是由Google在2018年提出的一种基于Transformer架构的预训练模型,迅速成为自然语言处理(NLP)领域的一个里程碑。BERT通过双向编码器表示和预训练策略&am…...
数字孪生技术如何助力低空经济飞跃式发展?
一、什么是低空经济? 低空经济,是一个以通用航空产业为主导的经济形态,它涵盖了低空飞行、航空旅游、航空物流、应急救援等多个领域。它以垂直起降型飞机和无人驾驶航空器为载体,通过载人、载货及其他作业等多场景低空飞行活动&a…...
HTTP背后的故事:理解现代网络如何工作的关键(二)
一.认识请求方法(method) 1.GET方法 请求体中的首行包括:方法,URL,版本号 方法描述的是这次请求,是具体去做什么 GET方法: 1.GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源。 2.在浏览器中直接输入 UR…...
数据流通环节如何规避安全风险
由于参与数据流通与交易的数据要素资源通常是经过组织加工的高质量数据集,甚至可能涉及国家核心战略利益,一旦发生针对数据流通环节的恶意事件,将造成较大负面影响,对数据要素市场的价值激活造成潜在威胁。具体来说,数…...
部署k8s 1.28.9版本
继上篇通过vagrant与virtualBox实现虚拟机的安装。笔者已经将原有的vmware版本的虚拟机卸载掉了。这个场景下,需要重新安装k8s 相关组件。由于之前写的一篇文章本身也没有截图。只有命令。所以趁着现在。写一篇,完整版带截图的步骤。现在行业这么卷。离…...
实验二:图像灰度修正
目录 一、实验目的 二、实验原理 三、实验内容 四、源程序和结果 源程序(python): 结果: 五、结果分析 一、实验目的 掌握常用的图像灰度级修正方法,包括图象的线性和非线性灰度点运算和直方图均衡化法,加深对灰度直方图的理解。掌握对比度增强、直方图增强的原理,…...
bash: ip: command not found
输入: ip addr 报错: bash: ip: command not found 报错解释: 这个错误表明在Docker容器中尝试执行ip addr命令时,找不到ip命令。这通常意味着iproute2包没有在容器的Linux发行版中安装或者没有正确地设置在容器的环境变量PA…...
全开源TikTok跨境商城源码/TikTok内嵌商城/前端uniapp+后端+搭建教程
多语言跨境电商外贸商城 TikTok内嵌商城,商家入驻一键铺货一键提货 全开源完美运营 海外版抖音TikTok商城系统源码,TikToK内嵌商城,跨境商城系统源码 接在tiktok里面的商城。tiktok内嵌,也可单独分开出来当独立站运营 二十一种…...
云原生、Serverless、微服务概念
云原生(Cloud Native) 云原生是一种设计和构建应用程序的方法,旨在充分利用云计算的优势。云原生应用程序通常具有以下特征: 容器化:应用程序和其依赖项被打包在容器中,确保一致的运行环境。常用的容器技…...
Windows上LabVIEW编译生成可执行程序
LabVIEW项目浏览器(Project Explorer)中的"Build Specifications"就是用来配置项目发布方法的。在"Build Specifications"右键菜单中选取"New",可以看到程序有几种不同的发布方法:Application(EXE)、Installer、.Net Inte…...
ref 和 reactive 区别
在Vue 3中,ref和reactive都是用于创建响应式数据的API,但它们之间存在一些关键的区别。以下是ref和reactive的主要区别: 1. 数据类型处理 ref:主要用于定义基本类型的数据(如字符串、数字、布尔值等)以及…...
深度学习计算机视觉中, 多尺度特征和上下文特征的区别是?
在深度学习和计算机视觉中,多尺度特征和上下文特征都是用来捕捉和理解图像中复杂模式和关系的重要概念,但它们的侧重点有所不同。 多尺度特征 (Multi-scale Features) 多尺度特征是指在不同尺度上对图像进行特征提取,以捕捉不同尺度的物体特…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
