
Linux专栏
文章平均质量分 90
学习Linux写的博客
每天敲200行代码
我变秃了 也变强了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux 网络基础三 (数据链路层协议:以太网协议、ARP 协议)
所有 ARP 层收到数据包后,都会。原创 2025-04-24 12:57:59 · 1033 阅读 · 0 评论 -
Linux 网络基础(三) TCP/IP协议
遍历路由表。目的 IP & 子网掩码,找到要去的目标网络,没找到就走默认网关。通过 Iface 发送。注意:IP 没有解决设备转发的具体功能,IP 提供的是转发的策略,核心不是转发,而是路径选择。原创 2025-04-21 12:44:49 · 477 阅读 · 0 评论 -
Linux 网络基础(二) (传输协议层:UDP、TCP)
因为 TCP 是面向字节流的,所以需要应用层来分开这些报文,如果处理的不好就会出现多读了或者少读了影响到了后续报文,这种问题就叫做粘包。首先要明确,粘包问题中的 “包” 是指的应用层的数据包。在 TCP 的协议头中,没有如同 UDP 一样的 “报文长度” 这样的字段,但是有一个序号这样的字段。站在传输层的角度,TCP 是一个个报文过来的,按照序号排好序放在缓冲区中。站在应用层的角度,看到的只是一串连续的字节数据。原创 2025-04-20 18:31:46 · 1871 阅读 · 0 评论 -
Linux 网络基础二 ——应用层HTTP\HTTPS协议
网络版计算器例如,我们需要实现一个服务器版的加法器。我们需要客户端把要计算的两个加数发过去,然后由服务器进行计算,最后再把结果返回给客户端。(1)约定方案A. 约定方案一客户端发送一个形如 "1+1" 的字符串。这个字符串中有两个操作数,都是整形。两个数字之间会有一个字符是运算符,运算符只能是 +。数字和运算符之间没有空格。... ...B. 约定方案二定义结构体来表示我们需要交互的信息。原创 2025-04-14 12:43:34 · 459 阅读 · 0 评论 -
Linux TCP网络套接字
对比 UDP 服务器,TCP 服务器多了获取新链接和监听的操作,而因为 TCP 是面向字节流的,所以接收和发送数据都是 IO 操作,也就是文件操作。原创 2025-04-01 10:37:49 · 1105 阅读 · 0 评论 -
Linux 云服务器开放端口
这里先点手动添加,再看自己是UDP还是TCP协议,找到对应的协议,目的就填你想开放的端口,源填所有IP/4 0.0.0.0 添加备注点击保存就开放好了。首先找到你买服务器的官网,我这里是阿里云。原创 2025-03-26 21:53:36 · 301 阅读 · 0 评论 -
Linux UDP网络编程套接字sockets
在学校我们用学号,相比于身份证更简便,假如我的学号是2211211023,这样就能看到我是22级的,方便阅读信息。但是,这两个结构体都不用,我们用 sockaddr。网络通信的本质是进程间通信,有了 IP 就可以标识公网内唯一的一台主机,想要完成网络通信我们还需要一个东西来标识一台主机上的某个进程,这个标识就是端口号(port)。三种应用场景:网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信,而原始套接字可以跨过传输层(TCP/IP 协议)访问底层的数据。原创 2025-03-25 20:27:17 · 881 阅读 · 0 评论 -
Linux 网络预备知识
在计算机网络通信中,报头(Header)是一部分数据包的固定结构,它包含了关于该数据包的元信息和控制信息。报头位于数据包的前部,用于标识和管理数据包的传输。报头通常由多个字段组成,每个字段用于存储特定类型的信息。下面是一些常见的报头字段及其功能:目标地址字段:指示接收数据包的目标设备或主机的地址。这个地址可以是物理地址(如:MAC 地址)或逻辑地址(如:IP 地址)。源地址字段:标识发送数据包的源设备或主机的地址。原创 2025-03-23 17:40:42 · 1001 阅读 · 0 评论 -
Linux 多线程-生产消费者模型&线程池&线程单例模式&其他
目录一、生产消费者模型1、模型概念2、基于 BlockingQueue 的生产者消费者模型3、C++ queue 模拟阻塞队列的生产消费模型【代码】(1)单纯生产数据1.0版本(2)加入任务结构体2.0版本 (3)wait误唤醒(4)多生产多消费3.0版本4、POSIX信号量(1)初始化信号量(2)销毁信号量(3)等待信号量(4)发布信号量 5、基于环形队列的生产消费模型并入信号量(1)架构(2)单生产单消费代码1.0(3)多生产多消费代码2.0(4)结论二、线程池1、概念2、线程池的应用场景3、代码三、线原创 2025-03-22 14:07:06 · 1478 阅读 · 0 评论 -
Linux 锁、线程同步
我们把tickets--自减操作细分为三步。原创 2025-03-19 19:44:27 · 1112 阅读 · 0 评论 -
Linux 线程控制
而这些都是线程库在做的事情,也就是线程的概念是库给我们维护的,我们用的原生线程库,也要加载到内存中,因为都是基于内存的。我们的线程库只需要维护线程的概念即可,不用维护线程的执行流,不过线程库注定了要维护多个线程属性集合,线程也要管理这些线程,先描述在组织。这是因为新线程内部执行进程替换函数,这看起来像是把新线程中的代码替换了,但实际会把主线程中的代码也替换了,因为主线程和新线程共享地址空间,所以新线程内部进程替换后,所有的线程包括主线程都会被影响。参数是void*,和这个函数的返回值的含义是一样的。原创 2025-03-16 23:31:59 · 1307 阅读 · 0 评论 -
Linux 线程概念
如上是是一个用户级页表,在我们学习进程的时候,我们知道进程=PCB+mm_struct+页表,进程通过用户级页表映射物理内存的方式来找到磁盘或内存中的数据。如果我们再创建一个进程,那么这个进程也有属于自己的PCB、地址空间、页表。原创 2025-03-15 09:35:41 · 707 阅读 · 0 评论 -
Linux 进程信号的捕捉&&信号补充内容
从内核态返回到用户态之前,OS 会做一系列的检测捕捉工作,它会检测当前进程是否有信号需要处理,如果没有就会返回系统调用,如果有,那就先处理(具体它会遍历识别位图: 假如信号 pending 了,且没有被 block,那就会执行 handler 方法,比如说终止进程,那就会释放这个进程,如果是暂停,那就不用返回系统调用,然后再把进程 pcb 放在暂停队列中,如果是忽略那就把 pending 中对应的比特位由 1 变为 0,然后返回系统调用)。用户态和内核态的权限级别不同,那么自然能看到的资源是不一样的。原创 2025-03-12 18:21:29 · 910 阅读 · 0 评论 -
Linux 进程信号
提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数)我们在上面写的Ctrl+c实际是给该进程发2号信号。我们接下来写个代码测试一下。我们先认识一个接口。原创 2025-03-11 19:39:33 · 1221 阅读 · 0 评论 -
Linux 消息队列&&信号量
我们讲进程通信,本质是让不同的进程看到同一份资源。我们已经给大家介绍了管道,共享内存,接下来我们给大家简单的介绍一下消息队列。原创 2025-03-04 11:27:35 · 1113 阅读 · 0 评论 -
Linux 共享内存
我们之前提到过,进程通信是让两个不同的进程看到同一份资源,所以我们给大家讲解了匿名管道和命名管道。今天我们还有一种方式两个不同的进程看到同一份资源。那就是共享内存!二、共享内存原理我们先来看这张图,我们在物理内存创建一个共享区,我们再让两个不同的进程通过页表分别映射到对应的共享区里,然后返回虚拟地址的起始地址。这就是共享内存,我们总结分为三步申请内存。将该内存挂接到进程地址空间的共享区。返回虚拟地址首地址。以上我们就创建好共享内存了,那我们该如何释放共享内存呢?原创 2025-03-01 14:20:30 · 1228 阅读 · 0 评论 -
Linux 日志系统·
当我们写一个函数,例如打开文件open,当我们打开失败的时候,会调用perror看到错误信息。接下来我们将带大家了解日志,并自主实现一个日志系统。这个就是我们定义的日志类的对象。原创 2025-02-26 17:41:31 · 1121 阅读 · 0 评论 -
Linux 命名管道
我们之前讲的管道只能有血缘关系的进程进行通信。这个管道是匿名管道。这节博客,我们将为大家讲解命名管道。原创 2025-02-25 19:07:31 · 796 阅读 · 0 评论 -
Linux 管道的应用场景
我们之前写过一段指令,这是我们之前用的管道。当我们用管道级联起这些命令的时候,每一个命令最终都会被变为一个进程。这些进程的父进程都是同一个,我们可以去看一下这个父进程是什么东西这些sleep进程,他们的父进程是bash进程。有血缘关系,能够进行通信。那我们也可以通过这样的例子,写一个简易版的进程池。原创 2025-02-25 13:16:52 · 1031 阅读 · 0 评论 -
Linux 进程通信——管道
进程通信是两个或多个进程实现数据层面的交互。因为进程具有独立性,导致进程通信的成本比较高,因为要打破进程的独立性。原创 2025-02-22 15:01:32 · 1638 阅读 · 0 评论 -
Linux 进程地址空间第二讲&&动态库地址
当我们创建一个进程的时候,进程里有一个进程地址空间,也会创建一个页表,页表里储存虚拟地址和物理地址的映射。那什么是虚拟地址,什么是物理地址呢?文件加载到内存时,CPU的作用是什么呢?原创 2025-02-20 16:44:50 · 1115 阅读 · 0 评论 -
Linux 动静态库
动态库:libc.so libc++.so。静态库: libc.a libc++.a。在命名的前缀lib和后缀so/a去掉就是库名,所以这是C/C++的动静态库。C/C++ 体系中如何使用别人的功能?生成可执行的方式有静态链接和动态链接,对应的是静态库和动态库。比如,张三是一名大一新生,他在写作业时突然有了一个上网的需求,但因为周边环境不熟悉,所以找了学长询问附近网吧的地点,随后就跑去玩了几个小时,然后回来后接着继续写作业,这就叫作动态链接。原创 2025-02-19 19:29:03 · 1288 阅读 · 0 评论 -
Linux 内存管理与文件页缓冲区
总之上面的过程其实就是下面的这张图也就是说,操作系统里面也有一个文件缓冲区,最后它会被刷新到磁盘上去上面的过程,我们就把打开文件和文件系统的文件 产生关联了!我们也可以发现,这里一共要经历三次拷贝,第一次将数据写入到C语言缓冲区中,第二次将数据从C语言缓冲区写入到文件缓冲区中,第三次是写在磁盘当中去。原创 2025-02-17 20:03:34 · 1006 阅读 · 0 评论 -
Linux 文件系统&&inode&&软硬链接
在我们电脑文件里,分为打开的文件和未打开的文件,我们在上几篇文章给大家介绍了打开的文件,现在我们重点介绍。我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,所以它是需要被操作系统管理的。也就是说这种方式,磁盘上和内存上都有这个文件,它们不是完全一样的,;而普通的未打开的文件在磁盘上,未被加载到内存中,它当然也要被管理;其中管理打开的文件和管理未打开的文件在操作系统中有一个功能模块叫做。原创 2025-02-17 13:28:59 · 844 阅读 · 0 评论 -
Linux 基础IO——重定向和缓冲区
很明显依靠函数原型,我们就能认为 dup2(1, fd),因为 1 是先打开的,而 fd 是后打开的.可实际上并不是这样的,文档中说 newfd 是 oldfd 的一份拷贝,这里拷贝的是文件描述符对应数组下标的内容,所以数组内容最终应该和 oldfd 一致。可这段代码中,执行到close(1)时,还没有调用write讲数据写入到1号文件描述符,就把对应的显示器文件描述符关闭了,此时的数据还在用户级缓冲区,刷新时显示不出来。,所以当你父进程准备刷新的时候,子进程也就有了同样的一份数据,随即产生两份数据。原创 2025-02-14 21:02:27 · 926 阅读 · 0 评论 -
Linux 文件、文件描述符
从广义上理解,键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件,因为 “Linux 下,一切皆文件”。从狭义上的理解,文件在磁盘(硬件)上放着,只有操作系统才能真正的去访问磁盘。磁盘是一种永久存储介质,不会受断电的影响,磁盘也是外设之一,所以对文件的所有操作都是对外设的输入输出,简称 IO(Input、Output)。原创 2025-02-10 20:53:19 · 1045 阅读 · 0 评论 -
Linux 进程地址空间
对大文件的分批加载,先把所有对应的虚拟地址填上,在页表里有一个标志位(标志对应的代码和数据是否已经被加载到内存),再根据标志位的"0"(未加载到内存),页表对应的物理内存暂时先空着,"1"则在页表填入物理地址。因为地址空间和页表是 OS 创建并维护的,也就意味着凡是想使用地址空间和页表进行映射,也就一定要在 OS 的监督之下来进行访问,也保护了物理内存中的所有合法数据,包括各个进程,以及内核的相关有效数据。划分成了一个个的区域,通过设置结构体内的 start 和 end 的值来表示区域的起始和结束。原创 2025-01-27 23:03:45 · 700 阅读 · 0 评论 -
Linux进程 -fork(初识),进程状态和进程优先级
平时创建进程一般是通过 ./myproc 运行某个存储在磁盘上的可执行程序来创建。而我们还可以通过系统调用接口来创建进程。pid_t是无符号整型。我们先看一段代码。原创 2025-01-25 13:52:31 · 894 阅读 · 0 评论 -
Linux 环境变量
目录一、环境变量的基本概念 1.常见环境变量 2.查看环境变量方法3.几个环境变量环境变量:PATH 环境变量:HOME环境变量:SHELL二、和环境变量相关的命令 三、库函数getenv,setenv四、环境变量和本地变量 五、命令行参数1.main 函数可以带参数吗?能带几个参数呢?2.命令行参数的意义 六、环境变量的组织方式 1、通过 main 的第三个参数获取环境变量2、通过全局变量 environ 获取环境变量在我们学习JAVA,Python我们都要在windows上配置环境变量。环境变量的概原创 2025-01-25 20:57:33 · 2143 阅读 · 0 评论 -
Linux 进程概念
在Linux中,每个执行的程序叫做进程,每一个进程都有一个id号。在window系统中,我们打开任务管理器就能看到,下面都属于一个个进程。那操作系统该如何管理进程呢?在我们上篇博客已经写到先描述,后组织。由操作系统先把进程的结构体描述出来,这个结构体对象叫做进程控制块(PCB,Processing Control Block),里面几乎包含了所有的进程属性信息,并在内部有一个指针指向该进程的代码及数据。原创 2025-01-24 13:31:15 · 1285 阅读 · 0 评论 -
Linux项目自动化构建工具-make/Makefile
上一期我们讲了vim编辑器,gcc/g++编译器。我们每次写完代码的时候都要输入指令,会很麻烦。尤其在大型项目中,有很多源代码,编译就十分复杂,本篇文章将介绍Linux环境下的项目自动化构建工具——make/makefile。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile。原创 2025-01-15 17:47:01 · 1155 阅读 · 0 评论 -
Linux 基本指令
在 more 的时候,我们并没有办法向前面翻, 只能往后面看但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!-a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。原创 2024-12-27 16:44:57 · 1395 阅读 · 0 评论 -
Linux开发工具--vim编辑器-gcc/g++编译器-gdb调试器
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。原创 2025-01-11 19:57:05 · 1514 阅读 · 0 评论 -
Linux 进程前篇(冯诺依曼体系结构和操作系统)
复习原创 2025-01-16 21:28:14 · 1466 阅读 · 0 评论