- 博客(102)
- 收藏
- 关注
原创 Linux网络多路转接poll
poll相对于select,它解决了文教描述符数量太小这个缺点。poll作用和select一样,是等待多个文件描述符就绪。
2025-11-17 16:49:36
207
原创 Linux网络多路转接select
1.select要正常工作,需要借助一个辅助数组,来保存所有合法fd2.每次使用都要重置3.就绪了,循环检测所有事件4.可监控的文件描述符个数取决于 sizeof(fd_set)的值缺点:• 每次调用 select, 都需要手动设置 fd 集合, 从接口使用角度来说也非常不便.• 每次调用 select,都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很 多时会很大• 同时每次调用 select 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大。
2025-11-17 13:29:40
385
原创 Linux网络五种IO模型
IO(Input/Output)指输入与输出,站在内存角度,向内存写就是输入,刷新就是输出,IO本质上是等待和拷贝(满的时候等待输出,空的时候等待写入)。高效IO指的是调用读写不用或减少等待,本质是单位时间内,减少等待的比重。五种IO模型实质上是五种结论:阻塞IO,非阻塞IO,信号驱动IO,多路复用/多路转接IO,异步IO;其中阻塞和非阻塞区别是等的方式不同,但是多路复用IO是效率最高的(数据量/等的时间)。
2025-11-16 16:15:56
419
原创 Linux网络DNS与ICMP
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.• com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.• baidu: 二级域名, 公司名.• www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似ftp.xxx.xxx/www.xxx.xxx 这样的格 式, 来表示主机支持的协议.
2025-11-15 16:54:34
1038
1
原创 Linux网络NAT、代理服务和内网穿透
同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略, 对客户端的请求进行过滤和限制,以保护后端服务器的安全。反向代理服务器是一种网络架构模式,其作为 Web 服务器的前置服务器,接收 来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回 给客户端。• 缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的 请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大 大减少后端服务器的负载,提升网站的响应速度。没有映射关系消息是发布出去的!
2025-11-15 11:27:19
914
原创 TCP全连接队列与tcpdump抓包
listen的第二个参数加1是全连接队列的节点个数,在服务器来不及进行accept的时候,底层tcp listen sock允许用户继续三次握手,建立连接成功,但是不能建立太多,最大数是blacklog+1。
2025-11-08 18:32:50
1110
原创 Linux网络传输层TCP协议
TCP是一个可靠的链接,保证可靠性有:校验和、序列号、确认应答、超时重发、连接管理、流量控制、拥塞控制。不仅如此,还提高了性能:滑动窗口、快速重传、延迟应答、捎带应答、定时器。而这些都是UDP不能保证的,但是不能简单的评判UDP和TCP快慢。
2025-11-04 20:50:08
617
原创 Linux网络传输层协议UDP
UDP传过去后,对方就是用这个结构体接受二进制数据,进行二进制的序列化和反序列化,但是不推荐应用层协议这么写,因为客户端的设备不一样,编写语言不一样,大小端问题等会导致结构体大小不同。UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数 据最大长度是 64K(包含 UDP 首部). 然而 64K 在当今的互联网环境下, 是一个非常小的数字. 如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。一个UDP完整报文,8字节后是报文。
2025-11-01 19:33:18
615
原创 Linux网络HTTPS协议原理
数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash 函数)对信息进行运算, 生成一串固定⻓度的数字摘要。数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。摘要常见算法:有 MD5、SHA1、SHA256、SHA512 等,算法把无限的映射成 有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)摘要特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不 过从摘要很难反推原信息,通常用来进行数据对比。
2025-11-01 16:42:33
897
原创 Linux网络http协议cookie和session
HTTP Cookie(也称为 Web Cookie、浏览器 Cookie 或简称 Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发 起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一 浏览器,如保持用户的登录状态、记录用户偏好等。HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。由于 HTTP 协议是无状态的(每个请求都是独立的),因此服务器需要通过 Session 来记住用户 的信息。
2025-10-30 19:54:15
1421
原创 Linux网络HTTP协议
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(各种资源,如 HTML 文档,视频,图片)。HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协议(底层是TCP),即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。
2025-10-22 11:00:13
678
原创 Linux网络应用层自定义协议与序列化
协议是一种“约定”,如果我们要传输一些结构化数据就需要协议,协议就是约定好的数据结构。假设现在我们要实现一个服务器版的加法器,我们需要客户端把要计算的两个加数发过去,然后由服务器进行计算,最后再把结果返回给客户端。对此,我们有两种传输数据的形式:约定方案一:1.客户端发送一个形如"1+1"的字符串;2.这个字符串中有两个操作数, 都是整形;3.两个数字之间会有一个字符是运算符, 运算符只能是 +;4.数字和运算符之间没有空格;约定方案二:1.定义结构体来表示我们需要交互的信息;
2025-10-05 16:53:39
657
原创 Linux网络Socket编程TCP
本文介绍了TCP服务器与客户端的实现方法,重点讲解了TCP与UDP的主要区别:TCP需要设置监听状态和连接建立过程。通过一个回显服务器案例展示了TCP服务器开发流程,包括socket创建、绑定、监听、多线程处理连接等核心步骤。同时提供了日志系统实现,支持多级日志记录和文件/屏幕输出。最后扩展了远程命令执行功能,通过管道实现客户端命令的服务器端执行。代码采用C++编写,包含完整的错误处理和资源管理,展示了Linux网络编程的基本模式和最佳实践。
2025-10-03 15:22:35
367
原创 Linux网络Socket编程UDP
以上都是单进程的,聊天室需要多线程,这次把之前写的线程池带进来,用来转发信息。inet_ntoa 把结果放到自己内部的一个静态存储区, 这样第二次调用时的结果会覆 盖掉上一次的结果,因此线程不安全,建议用inet_ntop。传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 "数据是谁发的, 要发给谁"。0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的 端口号都是固定的.但是一个端口号不能被多个进程绑定。
2025-10-02 09:52:54
1026
原创 Linux网络基础
但是网络通信不一样,主机与主机距离变远了,任何通信特征的变化就一定会带来新的问题,解决问题成本高,因此需要新的协议。MAC地址和IP地址区别:IP 地址在整个路由过程中,一直不变(特殊情况会变),Mac 地址一直在变,目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依 据,mac 地址是局域网转发的重要依据。其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程 中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5层协议。
2025-09-29 09:54:33
808
原创 Linux读者写者问题与读写锁
写者优先相反,当写者请求写入权限时,系统会尽快地让写者进入写入区,即使此时有读者正在读取,一旦有写者到达,所有后续的读者都会被阻塞,直到写者完成写入并离开写入区。写者优先策略可以减少写者等待的时间,但可能会导致读者饥饿(即读者长时间无法获得读取权限),特别是当写者频繁到达时。读者优先会尽可能允许多个读者同时访问,而不会优先考虑写者,新到达的读者允许进入读区,而写者会被阻塞,直到所有读者读完离开,会导致饥饿问题,写者长时间不能获取写权限。一般情况读者很多,写者很少;读者和写者-互斥和同步。
2025-09-27 20:23:58
227
1
原创 Linux简易线程池编写
【日志等级】【pid】【filename】【filenumber】【时间】 内容(支持可变参数)线程池和进程池差不多,要先预创建一批线程,用队列进行管理,本质是一个生产消费模型。本次在代码中添加日志,日志是软件运行的记录信息,向显示屏或者文件打印,有特定格式。单例模式:把构造函数和拷贝赋值语句设为私有,或者删掉。等级:DEBUG INFO WARNING ERROR FATAL。
2025-09-27 16:22:08
328
原创 Linux的POSIX信号量和生产消费模型的环形队列实现
摘要:本文介绍了POSIX信号量的使用及其在生产消费模型中的应用。信号量作为资源预定机制,通过sem_init初始化、sem_wait/sem_post进行PV操作。基于环形队列的生产消费模型中,使用data_sem和space_sem两个信号量分别表示数据量和剩余空间,保证线程安全。通过Push/Pop操作实现生产者插入数据和消费者获取数据,并配合互斥锁确保操作的原子性。最后展示了多线程测试代码,验证了环形队列的正确性。
2025-09-26 15:30:29
377
原创 Linux线程id与简易封装线程实现
站在用户角度上,我们需要的是线程的id,库对线程进行管理,因此会开辟一个内存块(类似大号结构体),tid是一个地址,未来管理线程只要找到线程控制块地址就行(tid)。如果想要全局变量每个线程都私有一份,在变量声明前加__thread(两个_),只在linux中有效,只能修饰内置类型(局部存储)。tid是给用户提供的,是pthread库自己维护的,LWP是内核的,不需要呈现给用户。默认共享地址空间,pthread库就封装了该系统调用,线程属性集合的其实虚拟地址在pthread库中维护。
2025-09-14 11:27:53
320
原创 Linux线程控制
本文介绍了Linux线程编程的基本概念和操作。主要内容包括:1.线程创建参数说明(线程ID、属性、函数指针和参数),编译时需要加-pthread选项;2.线程等待和终止方式,包括pthread_join和pthread_cancel的使用;3.线程分离的概念,通过pthread_detach实现线程自动回收;4.提供了多个代码示例展示线程创建、批量线程管理、线程终止和分离的实际应用。文中强调线程异常会导致整个进程崩溃,并解释了主线程退出的注意事项。
2025-09-13 16:32:14
322
原创 Linux多线程概念
本文介绍了操作系统内存管理和线程的基本概念。内存管理方面,操作系统以4KB页框/页帧为基本单位管理物理内存,通过struct page结构体进行描述。虚拟地址通过二级页表转换为物理地址。线程方面,Linux将线程视为共享地址空间的轻量级进程,使用task_struct结构体管理。线程相比进程具有切换开销小、资源共享等优点,但存在编程复杂度高、健壮性差等缺点。文章还对比了计算密集型和I/O密集型应用中线程数量的选择策略。
2025-09-12 18:17:10
908
原创 Linux信号
本文介绍了Linux系统中的信号处理机制。主要内容包括:1. 信号的基本概念和产生方式(kill命令、键盘、系统调用、软件条件、异常);2. 信号处理方式(默认、忽略、自定义捕捉);3. 信号阻塞与未决状态,通过sigset_t和sigprocmask管理信号屏蔽字;4. 信号捕捉的底层实现和sigaction函数;5. 可重入函数和volatile关键字;6. SIGCHLD信号处理及子进程回收。文章结合代码示例详细说明了信号的发送、屏蔽、捕捉等操作,并分析了内核态与用户态的切换过程,以及信号处理时的注意
2025-09-09 22:02:49
886
1
原创 Linux共享内存、消息队列、信号量
共享内存有唯一的标识符,但是如果让操作系统来生成,其他的进程就并不知道,这里的参数key就是用户提供的,只要保证key的唯一性就行,用来表示共享内存,shmget返回值是共享内存标识符。申请信号量的本质是对公共资源的一种预定机制。key:用户形成,内核使用的一个字段,用户不能使用key来进行shm的管理,内核进行区分shm的唯一性。IPC_CREAT | IPC_EXCL:如果创建的共享内存不存在,就创建,反之出错返回。IPC_CREAT:如果创建的共享内存不存在,就创建,反之获取该共享内存并返回。
2025-08-25 18:12:38
735
原创 Linux管道
本文摘要: 文章介绍了进程间通信的基本概念和实现方法,重点分析了管道通信机制。首先阐述了进程通信的必要性和共享资源的前提条件,随后详细讲解了SystemV标准下的三种通信方式。针对管道通信,文章通过代码示例展示了匿名管道在父子进程间的单向通信实现,并总结了管道的5种特征和4种运行情况。此外,还介绍了进程池的构建方法和命名管道的使用场景,通过server/client模型演示了无血缘关系进程间的通信实现。文中包含完整的代码示例,涵盖了管道创建、读写操作、资源回收等关键技术点。
2025-08-19 17:38:13
641
原创 Linux软硬链接与动静态库
本文摘要: 文章详细介绍了Linux系统中软硬链接的区别与创建方法,软链接类似快捷方式而硬链接是文件名的inode映射,硬链接数即磁盘引用计数。同时讲解了动静态库的创建与使用:静态库(.a)通过ar命令打包目标文件,动态库(.so)需编译为位置无关码并通过-shared生成,使用时需配置LD_LIBRARY_PATH等加载路径。动态库映射到进程共享区实现多程序共用,其加载依赖ELF格式和加载器构建虚拟地址空间。文中通过add函数示例演示了库文件的编译、打包及链接过程,并对比了动静态库在存储和运行机制的差异。
2025-08-08 19:26:16
897
原创 Linux文件系统
摘要:本文介绍了磁盘存储的基本原理和文件系统的组织结构。首先解释了CHS(柱面-磁头-扇区)寻址方式及其局限性,以及操作系统如何通过LBA(逻辑区块地址)进行更高效的磁盘访问。随后详细阐述了Linux文件系统的核心结构,包括inode、块位图、超级块等关键概念,重点分析了ext2文件系统中BlockGroup的分组机制和inode的映射方式。文章还说明了文件查找和删除的底层机制,对比了Linux与Windows在文件删除处理上的差异,并简要提及了路径缓存的实现原理。这些内容系统性地揭示了文件在磁盘上的存储和
2025-08-05 17:24:48
866
原创 Linux重定向和缓冲区
摘要:本文介绍了Linux系统编程中文件操作的核心概念。首先解析了struct stat结构体及其成员变量,展示如何获取文件大小等信息。然后通过代码示例演示了文件描述符重定向的本质——修改内核文件描述符表内容。重点分析了缓冲区的概念及其刷新策略(立即刷新、行刷新、全缓冲),特别说明了fork()对缓冲区的影响。最后剖析了FILE结构体源码,揭示其内部缓冲区实现机制和文件描述符封装原理。这些知识对于理解Linux系统级I/O操作和性能优化具有重要意义。
2025-08-02 17:32:30
477
原创 Linux文件fd
在task_struct存在一个struct file_struct* files,files存在struct file* fd_arrary[N]在操作系统内部,一定存在大量被打开的文件,会对其进行管理,每一个被打开的文件,一定存在对应的描述文件属性的结构体struct file。文件操作还是建议用语言提供的文件方法,因为平台不同,系统调用接口不同。打开文件:本质是进程打开文件,文件没被打开时候再磁盘上。文件描述符fd本质是:文件映射关系的数组的下标。操作文件:本质是进程操作文件。
2025-07-23 17:18:29
1106
原创 Linux简易shell编写
该代码实现了一个简单的Linux命令行解释器,主要功能包括:1.显示包含用户名、主机名和当前目录的命令行提示符;2.支持基本命令执行和"cd"命令(含路径处理);3.通过fork-exec执行外部命令。程序通过环境变量获取系统信息,使用strtok分割命令参数,能处理相对路径和特殊路径符号(~, -, ., ..)。运行后按Enter可退出程序。
2025-07-21 18:30:10
180
原创 Linux进程控制
进程=内核相关的管理数据结构(pcb,页表,地址空间)+代码数据(代码共享,数据写实拷贝)进程调用fork,当控制转移到内核中的fork代码后,内核分配新的内存块和内核数据结构给子进程,将父进程部分数据结构内容拷贝至子进程,添加子进程到系统进程列表当中 fork返回,开始调度器调度。
2025-07-20 17:29:04
883
原创 Linux地址空间
摘要:通过fork()创建的子进程与父进程共享相同的虚拟地址空间,但实际物理地址不同,这是由写时拷贝机制实现的。子进程修改数据时,操作系统会重新分配物理空间并更新页表映射,而只读数据则保持共享。地址空间是内核中的结构体,通过页表将虚拟地址转换为物理地址,实现进程间的内存隔离和保护。这种机制既节省空间,又确保了进程安全和有序访问内存。
2025-07-18 16:26:54
264
原创 Linux环境变量
这些命令行参数默认输入给父进程bash的,bash把它们变成main的参数,命令行启动的程序都会变成进程,都是bash的子进程,bash内部会自动生成argv表。环境变量是可以被子进程拿到,我们的程序一般都是bash的子进程,环境变量是全局的,bash内部有一张env表,是一个指针数组(字符串数组),以NULL结尾。像我们的指令,不需要带路径 ,但是自己写的要带路径,这是因为系统存在一些全局的设置,会告诉命令行解释器,应该去哪些路径下寻找可执行程序。PATH:环境变量,打印环境变量内容,$PATH。
2025-07-16 10:43:41
421
原创 Linux进程状态和优先级
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码,所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。当操作系统内存比较紧张,就把一些阻塞状态的进程的代码数据放到磁盘swap区(唤出),等调度的时候再唤入,有很多种挂起,如阻塞挂起、就绪挂起;进程进入了运行队列就是R状态,一个进程一旦持有CPU,不会一直运行到进程结束而不运行其他进程,内核是基于时间片进行调度的(并发,多个进程同时推进,不是同一时间都在运行,同一时间都在运行叫并行)。
2025-07-15 10:21:59
598
原创 Linux进程概念
fork之后,代码共享,大家都能看见,本质上是多创建了一个进程,该进程也有自己的代码和数据,进程具有独立性,把父进程杀掉不影响子进程,都有独立的task_struct,原则上数据要分开。任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),操作系统与硬件交互,管理所有软硬件资源,是一个软件,开机时启动的第一个软件,为用户提供一个良好的稳定的高效的执行环境。由于CPU速度很快,所以计算机整机的基本效率由数据设备间的拷贝效率决定,一般离CPU越近,效率越高,但是造价越贵。
2025-07-13 17:22:08
811
原创 Linux中gdb使用
GDB是Linux下常用的调试工具,使用前需通过gcc -g选项编译生成带调试信息的程序。调试时可通过list查看代码,break设置断点,run运行程序,next单步执行,step进入函数。print可查看变量值,setvar修改变量。其他常用命令包括:查看断点(infobreak)、删除断点(delete)、禁用/启用断点(disable/enable)、跟踪变量(display)、查看调用栈(bt)等。通过案例演示了如何打断点、查看变量、跟踪执行流程等基本调试操作。GDB还支持自动显示变量、查看函数调
2025-07-10 18:10:15
306
原创 Linux自动化构建工具make/makefile
make是一个命令,makefile是一个文件从上往下扫描默认形成第一个目标文件对最近新形成的可执行程序,默认不重新生成目标文件:默认形成的第一个文件依赖文件列表:资源文件一来方法:要执行的操作.phony:XXX:XXX对应方法,总是要被执行$@ 替换成目标文件$^ 替换成目标文件列表makefile会根据文件中的依赖关系,自行进行推导,帮助我们执行所有相关依赖方法。但是,最后要形成的文件要放在开头。
2025-07-09 10:18:44
166
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅