自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hello world/linux

c/c++/linux

  • 博客(119)
  • 收藏
  • 关注

原创 Linux:基于匿名管道创建出简易进程池(进程间通信五)

提前预分配资源,避免频繁创建 / 销毁的开销,实现资源复用、提升效率。

2026-01-06 15:04:18 519 20

原创 Linux:匿名管道的四种情况(进程间通信四)

了解了匿名管道的五种特性后,我们必须得谈谈匿名管道的四种情况--快读慢写,快写慢读,只写不读,只读不写,接下来我将一一讲述,话不多说现在开始。

2026-01-05 17:02:08 352 6

原创 Linux:匿名管道的五大特性(进程间通信三)

元旦快乐,期末周悲伤,这两个星期没时间学习计算机相关内容啦,今天是开年的的一篇博客,延续上一篇博客内容,今天我们来谈谈匿名管道的五大特征~~先说结论,

2026-01-05 10:46:00 782 5

原创 Linux:匿名管道(进程间通信二)

看上图,父进程由*files指向files_struct,也就是文件描述符表,现在我们打开一个文件,fd = 3,对于打开的文件,该文件内容被存放在array[fd]中,我们创建一个子进程,子进程继承父进程的*files,files_struct等等,此时父子进程的指针指向同一块地方,也就是被打开的文件,于是父子进程同时可以访问该文件的缓冲区,或许你会疑问,被打开文件最后不是还要写回磁盘吗,其实真正的管道是由OS创建的一块内存,不需要刷回磁盘,和磁盘没关系,这也符合通信间的本质!

2025-12-25 20:58:14 132 11

原创 Linux:简介(进程间通信一)

不同进程之间为了交换数据、同步执行、协调资源而使用的一整套机制/技术。因为进程彼此隔离、地址空间独立,不能像同一进程里的线程那样直接共享变量,所以需要 IPC 来“搭桥”

2025-12-25 18:41:17 401 7

原创 Linux:库制作与原理(四)

可写区域:专门存放“外部函数/全局变量的真实地址”。动态链接器在加载库后,把 GOT 里的条目填成正确地址。关键词:动态库、ldd、LD_LIBRARY_PATH、ldconfig、GOT、PLT、PIC。第一次调用某个外部函数:先跳到 PLT 的“桩代码”,由它去解析真实地址并写回 GOT。动态库需要被加载到“任意位置”,所以内部不能写死绝对地址;关键:调用动态链接器完成依赖库加载、符号解析与重定位。这就是你常听到的:“第一次调用慢一些,后面就稳了”。输出会列出依赖的共享库,以及动态链接器(例如。

2025-12-24 16:23:49 966 7

原创 Linux:库制作与原理(三)

同时把“可执行”和“可写”等权限隔离开,更安全。操作系统加载程序时,更关心 segment(段)。段是加载单位:哪些要映射进内存、权限是什么(R/W/X),这些信息记录在。到这里,你就不是“只会 gcc 一把梭”的选手了,下篇博客见啦~~是 ELF(可重定位),内部有 section 和符号等信息。的跳转地址像“空的”(例如全 0)。已经有了地址,说明链接把它“对上了”。:符号表(函数名/变量名等的记录)可执行文件:Executable。:未初始化的全局/静态变量占位。:已初始化的全局/静态变量。

2025-12-22 18:49:48 654 5

原创 Linux:库制作与原理(二)

动态库(.so):程序在运⾏的时候才去链接动态库的代码,多个程序共享使⽤库的代码⼀个与动态库链接的可执⾏⽂件仅仅包含它⽤到的函数⼊⼝地址的⼀个表,⽽不是外部函数所在⽬标⽂件的整个机器码在可执⾏⽂件开始运⾏以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中, 这个过程称为动态链接(dynamic linking)动态库可以在多个程序间共享,所以动态链接使得可执⾏⽂件更⼩,节省了磁盘空间。操作系统采⽤虚拟内存机制允许物理内存中的⼀份动态库被要⽤到该库的所有进程共⽤,节省了内存和磁盘空间。

2025-12-21 21:14:44 536 2

原创 Linux:库制作与原理(一)

什么是库库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能 每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:静态库 .a[Linux]动态库 .so[Linux]如果你使用win系统,或许有这样的报错这就说明改软件动态库缺失。

2025-12-21 11:21:04 745 18

原创 Linux:Ext系列⽂件系统(三)

路径解析是文件访问的 “导航逻辑”,从根目录逐级查找,核心是目录的映射表挂载是分区的 “接入方式”,让多个分区融入统一的目录树软硬连接是文件的 “复用技巧”,根据是否跨分区、是否依赖原文件选择使用理解了这些内容,你就能更灵活地管理磁盘和文件,甚至解决一些常见的系统问题(比如死链接清理、挂载失败排查)。文件系统的底层逻辑看似复杂,但只要抓住 “inode 是核心、目录是映射、挂载是连接” 这三个关键点,就能一通百通。

2025-12-19 08:52:19 1022 7

原创 Linux:Ext系列⽂件系统(二)

用 “块” 存储文件内容,提高读写效率;用 “分区” 划分磁盘功能,方便管理;用 “inode” 存储文件属性,作为文件的唯一标识;用 “目录” 维护文件名与 inode 的映射,让我们能通过文件名访问文件。

2025-12-19 08:49:25 789 3

原创 Linux:Ext系列⽂件系统(一)

对我们(以及 OS)来说,磁盘就是一个 “元素为扇区的一维数组”,数组下标是 LBA 地址 —— 我们不用关心磁头怎么移动、盘片怎么旋转,只需要告诉磁盘 “我要访问 LBA=XXX 的扇区”,剩下的底层转换全由磁盘固件完成理解这些底层逻辑,不仅能搞懂 “磁盘为什么慢”(磁头移动、盘片旋转需要时间),也为后续学习文件系统(比如 EXT4、NTFS 怎么管理扇区)打下基础 —— 毕竟所有文件的内容和属性,最终都是存在一个个扇区里的。

2025-12-17 10:59:37 962 5

原创 AI 工具实战测评:从技术性能到场景落地的全方位解析

2025-12-16 18:22:05 937 2

原创 Linux:基础IO(终)

⼜⽐如,我们使⽤打印机打印⽂档,由于打印机的打印速度相对较慢,我们先把⽂档输出到打印机相应的缓冲区,打印机再⾃⾏逐步打印,这时我们的CPU可以处理别的事情。读写⽂件时,如果不会开辟对⽂件操作的缓冲区,直接通过系统调⽤对磁盘进⾏操作(读、写等),那么 每次对⽂件进⾏⼀次读写操作时,都需要使⽤读写系统调⽤来处理此操作,即需要执⾏⼀次系统调⽤,执⾏⼀次系统调⽤将涉及到CPU状态的切换,即从⽤⼾空间切换到内核空间,实现进程上下⽂的切换,这将损耗⼀定的CPU时间,频繁的磁盘访问对程序的执⾏效率造成很⼤的影响。

2025-12-16 17:49:46 2000 12

原创 Linux:基础IO(四)

【代码】Linux:基础IO(四)

2025-12-13 18:02:59 270 4

原创 Linux : 基础IO(三)

如上图,我们先要知道一个进程可能会管理多个文件,同时这些文件有的可能要被打开,有的正在使用,有的打算关闭,而且系统里面存在多个进程,最后可能会有100个进程10000个文件,那么这些进程该怎么管理这些文件呢,我们类比一下就会想到进程调度,也是1:n的管理关系,采用的是链表链接struct的形式管理的。系统先读取磁盘文件到一个结构体struct_file里面,这个结构体保存着文件的属性集合,mode,读写位置等等等,其中还有一个缓冲区,这个缓冲区存放在文件的内容,文件的属性交给了其他变量。

2025-12-12 23:57:04 1220 8

原创 Linux:基础IO(二)

标志位(也常叫状态位 / 标志位掩码)是编程中一种利用整数的二进制位来表示多个独立的状态、命令或属性的设计技巧。一个整数在内存中以二进制形式存储(比如 32 位整数有 32 个二进制位,每位是 0 或 1);我们将每一个二进制位映射为一个独立的 “开关” 或 “命令”(1 表示开启 / 生效,0 表示关闭 / 无效);再通过宏定义给每个位赋予具体的语义(比如第 0 位代表 “读”,第 1 位代表 “写”);最终可以通过位运算(位或、位与等)来组合多个标志,或判断某个标志是否生效。

2025-12-11 23:02:54 978 3

原创 Linux:基础IO(一)

⽂件的读写本质不是通过 C 语⾔ / C++ 的库函数来操作的(这些库函数只是为⽤⼾提供⽅便),⽽真正对文件操作是通过⽂件相关的系统调⽤接⼝来实现的。发现是追加,即和fopen(a)的现象一样,都是追加写入,所以我们可以写出一个echo > >,即用fopen(a)打开,然后写入内容。发现和fopen(w)的现象一样,都是先清除再写入,所以我们可以写出一个echo > ,即用fopen(w)打开,然后写入内容。磁盘上的⽂件 本质是对⽂件的所有操作,都是对外设的输⼊和输出 简称 IO。

2025-12-10 00:15:52 696 4

原创 Linux进程最终篇章:自定义shell的编写,运用前面所有知识

前面我们一直学习进程相关知识,但是我们不能很好的将他们串起来,只是一味的接受理论知识,但是我们有一句话,,所以今天我们将运用到前面所学的知识,自定义编写一个shell。

2025-12-08 22:09:20 639 13

原创 Linux:进程替换(进程控制四)

对于返回值,exec*函数,只有失败返回值,如下图可是我们有一个问题,我不想让这个进程将我的原始进程给破坏掉,我想达到的效果是都执行,那该怎么办呢?--子进程来帮助我们,我们创造一个子进程(fork),让子进程执行我们需要替换的进程,父进程等待接收子进程就可以啦,这样完成了两个都实现下面对code.c的代码进行修改。

2025-12-06 10:42:02 627 5

原创 Linux:进程等待(进程控制三)

这里面pid是什么呢?我们通过man可以查看我们不关心的:pid < -1就是。

2025-12-03 14:43:46 869 7

原创 Linux:进程终止(进程控制二)

那么_exit存在的意义是什么呢,完全可以用exit取代呀,其实是因为我们这个测试代码无法体现,我们现在换一个代码(其实就是将printf("func start\n")的\n去掉)其实return是⼀种常⻅的退出进程⽅法,执⾏return n等同于执⾏exit(n),因为调⽤main的运⾏时函数会将main的返回值当做exit的参数。进程终⽌的本质是释放系统资源,就是释放进程申请的相关内核数据结构和对应的数据和代码。所以缓冲区应该在c库里面,没错,缓冲区是c语言自带的,而不是操作系统提供的。

2025-12-03 09:58:52 907 4

原创 Linux:进程创建(进程控制一)

前面我们已经学习了进程初识,现在我们来深入进程的学习,也就是进程的控制。

2025-12-02 20:37:24 324 9

原创 linux:虚拟地址空间与物理地址空间(进程六)

我们在讲C语⾔的时候,⽼师给⼤家画过这样的空间布局图(32位)可是我们对他并不理解!可以先对其进⾏各区域分布验证:i < argc;i++)env[i];编译运行出结果:代码中的打印语句输出结果示例对应虚拟地址空间分区说明代码段(.text)main是程序的可执行函数,存放在代码段已初始化数据段(.data)g_val是初始化的全局变量,存放在.data 段未初始化数据段(.bss)g_unval是未初始化的全局变量。

2025-12-01 18:26:35 1228 2

原创 Linux:命令行参数与环境变量(进程五)

命令行参数是程序启动时,用户通过终端传递给程序的额外信息在 C 语言中,main函数通过argc和argv两个参数来接收它们argc是参数的总个数(包含程序名)argv是一个字符串数组,存储了具体的参数内容,argv[0]是程序名,argv[argc]为NULL掌握了命令行参数,你就可以编写更加灵活和通用的程序,比如像 lsgcc这样功能强大的命令行工具在下一部分,我们将学习环境变量,它是操作系统为进程提供的另一种重要的配置信息来源。

2025-11-30 20:59:37 982 13

原创 Linux:进程的切换与调度(进程四)

在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成本增加,我们称之为进程调度O(1)算法!

2025-11-27 23:20:58 1171 8

原创 Linux:进程优先级(进程三)

PRI值越⼩越快被执⾏,那么加⼊nice值后,将会使得PRI变为:(PRI = PRI(默认) + NI)能,还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤大改善系统整体性能。需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影。PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏(默认是80,最快60,最慢99)PRI也还是⽐较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执⾏的先后顺序,此。

2025-11-27 11:50:14 880 4

原创 Linux:进程状态(进程二)

与僵尸进程相反,孤儿进程顾名思义就是没有父母的进程,也就是父进程比子进程先结束,那次是怎么办呢,如果没人接管他,就会变成僵尸进程,造成内存泄露,所以此时pid为1的进程(可以简单理解为操作系统)接管他了,不仅接管了,而且还自动将其变为后台进程(也就是.cmd &),所以我们无法使用ctrl+c退出,只能使用kill -9 pid来杀死子进程。可是这个事件里面谁都没有错,操作系统为了一整个进程无奈丢弃S状态进程,进程需要服从操作系统,所以必须被丢弃,磁盘需要干自己的事情,不可能一直等进程。

2025-11-24 20:44:45 843 13

原创 Linux:进程概念(进程一)

我们的可执行程序最开始是在磁盘上的,但是只有内存才能运行可执行程序,所以内存开始读取磁盘上的可执行程序,这就是自己写的程序代码,只可以读,不可以写,而从我们程序里面记录的值(如全局变量),就是数据,可读可写。根据上面的说法,这里应该会输出三个printf,第一个是父进程(也就是最开始的进程),然后fork了一个子进程,于是输出一个子进程的printf,输出一个父进程的printf。fork的作用是创建一个子进程,而创建的子进程没有自己的代码和数据,会跟着父进程一起执行接下来的代码。

2025-11-21 09:06:24 1094 23

原创 Linux:进程概念(操作系统Operating System)

计算机管理硬件1. 描述起来,⽤struct结构体2. 组织起来,⽤链表或其他⾼效的数据结构。

2025-11-19 23:25:52 708 5

原创 Linux:进程概念(冯诺依曼体系结构)

• 这⾥的存储器指的是内存(冯诺依曼体系的核心是‘程序和数据统一存储’,其中我们日常讨论的‘主存储器’指内存(区别于外存 / 磁盘),CPU 直接操作的是内存,寄存器是 CPU 内部的高速存储单元,仍属于存储器范畴),而非核心设计目标。正确逻辑:“早期计算机程序和数据分开存储,修改程序需要重新接线 / 打孔,冯诺依曼提出‘程序 = 数据’,统一存入存储器,按地址读取,既简化了硬件设计,又降低了使用成本,让计算机普及成为可能。对冯诺依曼的理解,不能停留在概念上,要深⼊到对软件数据流理解上,请解释,从你登录。

2025-11-19 23:05:56 366 1

原创 Linux:基础开发工具(六)

今天我们来讲,作为我们基础开发工具终章,这个难度可想而知,不过不要着急,我会带着你一步一步使用它因为cgdb是gdb的升级版,所以我们主要使用cgdb。

2025-11-18 15:26:48 1202 9

原创 Linux:基础开发工具(五)

今天我们来学习。

2025-11-18 13:24:57 1238 4

原创 Linux:基础开发工具(四)

• 会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒• ⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作• makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。

2025-11-16 13:42:38 842 7

原创 Linux:动态链接与静态链接以及动态库与静态库

我准备用三个月聚焦Linux学习,从系统编译到网络编译,让我们对Linux有全新的认识前一章博客的问题这一章就会得到解答,所以接下来的博客就敬请期待在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链

2025-11-14 16:14:12 682 1

原创 Linux:基础开发工具(三)

前文我们着重讲解了Linux里面,这篇博客我们将话不多说,现在开始啦。

2025-11-14 08:37:18 908 6

原创 Linux:基础开发工具(二)

• 三种模式• 正常模式• 插⼊模式• 底⾏模式• 我们⼀共有12种总模式,⼤家下来可以研究⼀下• vim操作• 打开,关闭,查看,查询,插⼊,删除,替换,撤销,复制等等操作。

2025-11-13 15:54:38 1269 4

原创 Linux:基础开发工具(一)

• 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序.• 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安装• 软件包和软件包管理器, 就好⽐ "App" 和 "应⽤商店" 这样的关系.

2025-11-13 10:35:35 1911 5

原创 Linux权限的概念以及多用户协同编译的方法

• ⽬录的可执⾏权限是表⽰你可否在⽬录下执⾏命令。• 如果⽬录没有 -x 权限,则⽆法对⽬录执⾏任何命令,甚⾄⽆法 cd 进⼊⽬, 即使⽬录仍然有 -r 读权限(这个地⽅很容易犯错,认为有读权限就可以进⼊⽬录读取⽬录下的⽂件)• ⽽如果⽬录具有 -x 权限,但没有 -r 权限,则⽤⼾可以执⾏命令,可以 cd 进⼊⽬录。但由于没有⽬录的读权限• 所以在⽬录下,即使可以执⾏ ls 命令,但仍然没有权限读出⽬录下的⽂档。

2025-11-11 14:56:56 624 2

原创 Linux第三章 : 基础的指令(终)

博客啦,这篇博客结束后,我们就掌握了基本的指令了,此时我们就拥有了武器,可以继续进军Linux了。

2025-11-10 11:48:37 917 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除