漫话linux
文章平均质量分 75
c栈算法小辰哥
华中农学院的大二计科,陪伴和爱着每一个支持我和帮助我的人
展开
-
高并发内存池1:内存申请与释放
高并发内存池第一版,实现内存申请和释放原创 2024-10-28 17:00:12 · 802 阅读 · 1 评论 -
高并发内存池:线程缓存测试
【代码】高并发内存池:线程缓存测试。原创 2024-10-23 15:07:58 · 99 阅读 · 2 评论 -
漫话linux:Socket接口
在服务器端,INADDR_ANY(0.0.0.0)可以让服务器监听所有可用的网络接口,而不必指定具体的IP地址,这种方式提高了代码的可移植性。2.type:套接字类型,如SOCK_STREAM(字节流,TCP),SOCK_DGRAM(数据报,UDP)在服务器端,必须绑定一个IP地址和端口号,以便客户端可以与服务器建立通信,bind()函数用于将套接字与IP和端口号绑定。1.服务器初始化:调用socket()创建套接字,调用bind()绑定地址和端口,调用listen()进入监听状态。原创 2024-10-14 15:54:56 · 830 阅读 · 3 评论 -
漫话linux:sockaddr
通过sockaddr结构体,Socket API实现了网络通信和本地通信的统一接口,它的设计理论类似于多态,即通过一个通用的接口来处理多种类型的地址格式。原创 2024-10-14 12:06:20 · 710 阅读 · 1 评论 -
漫话linux:网络基础2与Socket编程基础知识
IP与mac:IP地址是数据传输的终极目标,而mac是数据传输的小目标,若干个mac组成了IP,IP地址在传输地址中是不变的,mac地址出局域网后源和目的都要被丢弃,每经过一个设备都要变化,经由路由器封装。TCP:传输控制协议,面向连接的,可靠的,基于字节流的传输层通信协议,可以解决数据传输中丢包乱序的方法,但是维护复杂,在银行等严谨场景下使用。IP及上层是一样的,IP层使用路由器使得IP协议屏蔽了底层网络的差异,实现了全球主机的IP协议相同,体现了网络层状结构的优越性。原创 2024-10-14 09:27:22 · 673 阅读 · 1 评论 -
漫话linux:网络基础
1.物理层:负责光电信号的传递方式,如网线,wifi等,注意集线器Hub工作在物理层,调制解调器(猫,光猫)也在物理层,其工作目的就是实现模拟信号与数字信号的转换,wifi,就是先把光纤接入猫,然后猫拉一个先连接路由器,路由器帮我们构建一个局域网然后就可以连接wifi了,我们把消息传给路由器,路由器经过物理设备猫,然后将模拟信号转换为数字信号传给网络把数据发送出去。每台主机在局域网上,都有一个自己的mac标识(独一无二),在网卡上,当收到信息后会进行报头与mac地址进行对比,不是丢弃,是就向上交付。原创 2024-10-14 07:58:28 · 805 阅读 · 1 评论 -
漫话linux:教你如何用多线程操作实现cp模型(饿汉模式)(mini项目)
还有就是我们要实现的cp模型,就是模拟消费者和生产者的关系:消费者与消费者的关系是互斥的(两个人不能同时扫码),生产者与生产者的关系是互斥的(一家厂房不能有两个企业),消费者和生产者在建立上是互斥的,在行为上是同步的(可以同时卖和买,但是消费者不能去人家生产者的厂子里吃),这就是我们用锁的规划。首先是挑选单例模式:饿汉模式与懒汉模式,这里我选择不太麻烦的饿汉模式,也就是正常写,少用new来简化代码,要啥写啥,那么饿汉模式的问题是啥呢?接下来是head2.hpp中的Task类,简单写了一个。原创 2024-10-08 21:07:35 · 347 阅读 · 1 评论 -
漫话linux:单例模式,自旋锁与读写锁
2.智能指针:unique_ptr的作用范围限定在当前代码块内,不涉及线程安全问题,shared_ptr的特点是多个对象可能共享同一个引用计数变量,存在线程安全问题,所以标准库在实现shared_ptr时,采用了基于原子操作(如CAS)的方式来保证引用计数的操作既高效又原子,从而确保线程安全。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。1.悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。原创 2024-10-05 10:24:06 · 806 阅读 · 1 评论 -
漫话linux:信号量
1.信号量,就是对锁的原子性操作P(--)V(++)的一个计数器,本质是描述资源数目,把资源是否就绪放在了临界区之外,申请信号量的时候其实已经在做判断了,P--访问资源--V。3.意义:多生产多消费模型不仅仅局限于将任务或数据放入交易场所,而是包含了任务生产前和消费后的处理过程,这两个阶段往往是最耗时的。3.value:信号量的初始值,即计数器的初始值。返回值:成功返回0,信号量的值-1,失败返回-1,信号量的值不变。返回值:成功返回0,信号量的值+1,失败返回-1,信号量的值不变。4.等待信号量(P)原创 2024-10-03 16:04:04 · 301 阅读 · 1 评论 -
漫话linux:死锁与同步
push逻辑:首先锁定互斥锁,确保没有其他线程正在访问队列,然后检查队列是否已经满了,使用while循环而不是if可以防止线程被虚假唤醒,如果队列已满,则等待生产者条件变量(解锁互斥锁,将调用线程置于等待队列中,直到一个线程对生产者条件变量使用signal或broad_cast,当线程被唤醒时,该函数会在重新获取互斥锁之前返回),如果不满,则将in加入队列中,再触发消费者条件变量(队列现在不为空,可以买了),表示有东西已经生产完成,再解锁互斥锁,表示可以调用其他部分。两个线程都是先申请A锁在申请B锁。原创 2024-10-03 11:22:25 · 1206 阅读 · 2 评论 -
漫话linux:线程锁
一个函数在重入的情况下,运行结果不会 出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数,可重入的一般也是线程安全的。临界区中,线程可以切换,在线程被切出去的时候,是持有锁被切走的。我不在期间,照样没有人能进入临界区访问临界资源,对于其他线程来讲,一个线程要么么有锁,要么释放锁,当前线程访问临界区的过程,对于其他线程是原子的。交换的本质:把内存中的数据(共享),交换到 CPU 的寄存器中,其实是换到 CPU 此时执行的线程的硬件上下文中,数字 1 (锁)只有一个,随着上下文走了。原创 2024-10-02 03:43:26 · 743 阅读 · 1 评论 -
漫话linux:线程特性,分离与并发
代码解析,首先是结构体ThreadData,存储线程名和初始化,然后是全局变量tickets模拟电影票数,然后是getticket函数,传入一个线程数据,强转后提取线程名字,然后是一个死循环,如果有票就抢,没有就终止,线程结束后再打印名字,然后是主函数,存储多线程的id信息,以及传参数组,再创建4个线程同时抢票。该线程 ID 和前面说的线程 ID 不是一回事。寄存器不等于寄存器的内容,线程在执行的时候,将共享数据,加载到 CPU 寄存器的本质:把数据的内容,变成了自己的上下文,同时自己拷贝了一份数据。原创 2024-10-01 09:58:13 · 839 阅读 · 0 评论 -
漫话linux:线程控制与多线程
request需求类,有三个对象,开始,结束和线程名,response有两个成员,一个用于计算结果另一个用于计算结果是否可靠,然后是sumcount函数(传入线程标识指针),先强转为request对象指针,初始化response的两个成员,然后从request的开始到结尾,打印信息并更新response,再释放空间,主函数就是创建一个request对象再传进去,进行线程通信(首先创建进程并获取返回值,类型转化并打印结果,实现子线程与主线程的通信)线程库要不要管理这些线程呢?原创 2024-09-30 10:44:15 · 795 阅读 · 1 评论 -
漫话linux:线程
9.原来,进程分为PCB(内核数据结构)和代码数据,现在,进程可以进一步划分为PCB,进程地址空间和页表,进程是承担分配系统资源的基本实体,进程分配一块进程地址空间给线程,线程是进程内部的执行流资源。17.线程异常:单个线程出现除零,野指针问题导致线程崩溃,进程也随之崩溃,线程是进程的分支,线程出异常,就类似进程出异常,进而触发信号机 制,终止进程,进程终止,该进程内的所有线程也就随即退出。线程的执行本质上就是进程在执行,线程是进程的一个分支,线程在执行,线程内的切换不需要重新 cache 数据。原创 2024-09-25 20:15:02 · 636 阅读 · 0 评论 -
漫话linux:信号的捕捉
首先调用进程1,在哨兵位head后插入一个节点1,此时在另一个窗口调用进程2,往head后面插入一个节点2,此时head->next会在两个进程中指向不同的节点,但是head->next只能指向一个节点,所以进程2创建的节点会覆盖进程1创建的节点,导致程序出现问题,出现节点丢失。执行信号捕捉方法之前,先清0,在调用,来使信号再次产生时,当前信号完成了再执行下一个,禁止不断嵌套式的捕捉。问题2:信号被处理的时候,对应的信号也会被添加到block表中,防止信号捕捉被嵌套调用。当接收到信号时,信号处理函数。原创 2024-09-25 08:36:24 · 867 阅读 · 0 评论 -
漫话linux:信号的保存和处理
因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,是系统给用户提供的, sigset_t称为信号集,这个类型可以表示每个信号 的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有 效”和“无效”的含义是该信号是否处于未决状态。如果oset和set都是非空指针,则先将原来的信号屏蔽字备份到oset里, (保存就有意义:可以实现之后的交换,返回)然后 根据set和how参数更改信号屏蔽字。2.信号从产生到递达之间的状态叫信号未决。原创 2024-09-24 21:12:33 · 693 阅读 · 0 评论 -
漫话linux:信号
linux在一次登录中一般会创建一个bash,所以在一次登录中只允许一个进程是前台运行状态(无论何时,接收用户键盘输入的只能有一个进程),但运行多个进程处于后台运行状态(可以同时进行多个进程的运行,但不会接收用户输入,且不会影响前台进程),当没有进行其他前台进程的运行时,默认前台进程是bash或shell,bash作为命令行解释器,会自动接收和执行用户命令,在启动后台进程时,bash命令仍然是前台进程可以获取其他指令。3.由此看出,在C/C++中,除零,内存越界等异常,在系统层面上,是被当成信号处理的。原创 2024-09-24 08:12:36 · 735 阅读 · 0 评论 -
漫话linux:共享内存
1.共享内存:进程间通信(IPC)的本质就是让不同进程看到同一份资源,而共享内存是最快的IPC形式,当使用共享内存时,IPC就不会涉及到内核,共享内存也没有涉及到访问与控制(同步与互斥)3.处理:越界通常由程序本身处理,例如,在数组访问中,如果访问的索引超出了数组的大小,程序会触发一个越界错误。处理器架构:不同的处理器架构默认支持不同的字节序。共享内存被删除后,则其他线程直接无法通信是错误的,共享内存的删除操作并非直接删除,而是拒绝后续映射,只有在当前映射链接数为0时,表示没有进程访问了,才会真正被删除。原创 2024-09-23 07:51:50 · 1306 阅读 · 1 评论 -
漫话linux:命名管道和日志管理
首先按照路径和权限创建命名管道,如果errno没有报错就打印信息,然后按照路径打开管道,然后设置死循环开始通信,首先设置一个用于接收信息的buffer数组,再从管道中读信息,如果x大于0(表示读取的字节数),就给buffer的x位置加一个\0,如果x等于0,说明管道中的信息已经超过了buffer的存储极限,打印信息并退出,x小于0出错直接退出,最后关闭文件描述符。3.消息分类:info:常规消息,warning报错信息,error:严重了,可能需要立刻处理,fatal:致命的,debug:调试。原创 2024-09-22 08:35:14 · 879 阅读 · 2 评论 -
漫话linux:手搓简易线程池(正式版)
注意要使用c++11进行编译,所以文件名,g++格式都要进行变化。原创 2024-09-20 09:52:15 · 244 阅读 · 0 评论 -
漫话linux:自定义shell管道,构建简易线程池
6.为什么要设置缓冲区,slab分配器:slab 分派器是一种内存管理技术,用于高效地分配和释放小块内存,减少系统调用,系统调用是有成本的,(如内存分配)需要从用户空间切换到内核空间,任务码和管道:使用管道和任务码来选择性地调用子进程,实现进程间通信和任务调度。4.写端正常写入,读端关闭,操作系统就要通过信号kill掉正在写入的进程,管道读端的文件描述符被关闭,write操作产生信号SIGPIPE,让write进程退出,这就是shell管道。3.在父进程中,在所有子进程创建之后,也关闭所有管道描述符。原创 2024-09-18 14:37:54 · 777 阅读 · 1 评论 -
漫话linux:进程替换
第二个参数是程序名,这里是"mycmd",它是传递给新程序的argv[0]的值。接下来的参数是传递给mycmd程序的命令行参数,在这个例子中只有一个"-b"。与 fork 和 spawn 类似的功能不同,exec 不会创建新的进程,而是替换当前进程的用户空间映像,即它将当前进程的代码段、数据段和堆栈替换为新程序的代码和数据,同时保留进程的内核资源,如打开的文件描述符、环境变量等。函数用于执行其他程序,它会将当前进程的地址空间替换为新程序的地址空间,从而实现程序的替换执行。),即程序名和一个额外的参数。原创 2024-09-16 16:41:16 · 924 阅读 · 0 评论 -
漫话linux:进程间通信
把文件这套拿过来,用就是为了简单,我们想让子进程进行写入,父进程进行读取,如果要双向通信,就需要多个管道,如果进程没有任何血缘关系,就不能用如上原理进行通信,因为无法继承一套file_struct。3.既然是通信,势必有一方在写,一方在读,而现在父子双方都是以写的方式打开,它们怎么进行通信呢?5.从底层设计,从接口设计,都要由操作系统独立设计,一般操作系统,会有一个独立的通信模块--隶属于文件系统--IPC 通信模块,定制标准 -- 进程间通信是有标准的 -- system V && posix。原创 2024-09-13 08:10:29 · 823 阅读 · 0 评论 -
漫话linux:基础IO,软硬链接,动静态库管理
1.生成静态库,以达到保密封装的作用,方法:可以先将.h 和.c 打包成 .o,库的原理和上面类似,只是将所有的.o为后缀的文件打包在了一起,形成了一个库,在使用的时候直接使用这个库就可以,指令为ar -rc libname.a[所有待打包.o],将所有.o文件制作成静态库,该指令中,ar是gnu的归档工具(Archive files),rc表示replace和create。1.软链接:是一个独立文件,具有独立的 inode ,也有独立的数据块,它的数据块里面保存的是指向的文件的路径,公用 inode。原创 2024-09-12 09:00:50 · 1370 阅读 · 2 评论 -
漫话Linux:磁盘与文件系统
这些信息包括但不限于:文件系统类型:如Ext家族,文件系统快大小(1024字节,2048字节等),文件系统的总块数和剩余块数,文件系统的总inode数和剩余inode数,文件系统的挂载时间,上次写入时间,上次检查时间等,文件系统的特征标准(如是否具有日志功能)每个块组都包含一个块组描述符,该描述符包含了该块组的一些重要信息,例如:该块组内的数据块总数,该快组内可用数据块的数量,该快组中inode总数,该快组后可用inode数量,该块组的块位图和inode位图,该块组inode表的位置。原创 2024-09-10 18:30:15 · 779 阅读 · 0 评论 -
漫话linux:重定向
1.文件编码:在执行部分文件操作时,系统会返回一个文件描述符方便你快速的找到文件并对文件进行其他操作,而在尝试后会发现文件描述符默认从3开始,那0,1,2代表的是什么呢?具体应用: new be old ,新的被老的覆盖,所以保留的是 old,dup2(old, new),所以前一个文件会拷贝形成 double 份,如果想实现对之前操作的实现,即 dup2(fd,1)这里可能有这样一个问题,如果同一个文件被多个指针指向,但是某个进程把这个文件关了,会不会影响其他进程对这个文件的操作呢?原创 2024-09-10 11:42:21 · 641 阅读 · 0 评论 -
漫话linux:模拟实现简单shell
这些内建命令通常在操作系统的shell环境中被频繁使用,并且执行速度更快,因为它们不需要创建新的进程来执行。一般情况下,status 是由wait或waitpid函数返回的子进程状态,其中包含了有关子进程终止的信息,包括退出状态。在C语言中,WEXITSTATUS(status) 是一个宏,用于从wait或waitpid返回的状态信息中提取子进程的退出状态。解决思路:memset函数,将一段内存区域设置为指定的值,它的原型是:void *memset(void *s, int c, size_t n);原创 2024-09-09 14:15:47 · 668 阅读 · 0 评论 -
漫话linux:进程
根据冯诺依曼体系,要运行一个程序,需要先从磁盘中读取数据(二进制文件)到内存中,进入操作系统,代码给运算器,数据给控制器(两个共同构成cpu),在操作系统中,系统可以同时有多个进程,就要进行进程管理,管理的方法是先描述再组织,任何一个进程,在加载成真正的进程时,操作系统要先创建进程的结构体对象--PCB(进程编号,进程状态(运行,休眠等),优先级),根据进程的PCB类型,为该进程创建对应的PCB对象,对进程的管理,就是对于进程PCB构成链表的增删查改。PRI代表进程的优先级,NI代表进程的nice值。原创 2024-09-08 14:08:42 · 1010 阅读 · 0 评论 -
漫话linux:操作系统初步
4.所有设备只能和内存打交道,都是独立的个体,都要用线连接起来,总线分为系统总线(内存交互)和IO总线(与外设沟通)2.操作系统包括两个部分:内核(内存管理,进程管理,文件管理,驱动管理),其他程序(函数库shell程序等)2.系统调用功能比较基础,对用户要求比较高,所以开发者对系统调用进行适当封装,形成了库,便于开发和二次开发。4.定位:在整个计算机系统的软硬件架构中,操作系统的定位赛一款纯正的搞管理的软件。1.软件是由操作系统完成的,操作系统是一款进行管理的软件,负责管理硬件和软件。原创 2024-06-22 19:04:17 · 276 阅读 · 4 评论 -
漫话linux:gdb调试指令
gdn是linux下的一个开源的命令行调试器,它可以帮助程序员在调试程序时跟踪程序运行过程中的错误。它可以用于C、C++、Fortran、汇编语言等多种编程语言。通过GDB,你可以在程序运行时中断程序的执行,查看和修改变量的值,设置断点,单步执行代码,打印函数调用栈等操作。基于gdb强大的调试能力,我们可以快速定位程序运行过程中的错误,用gdb因为gcc是release编译,无法使用debug编译。原创 2024-06-20 22:28:14 · 373 阅读 · 3 评论 -
漫话linux:关于git的小操作
隐藏文件.gitignore,里面存放的是文件后缀,如果文件有这些文件后缀是不会提交仓库的,为什么用户是可以随意改变里面的内容,而不是和.git一样一般不要动,因为linux的文件后缀可以自己定义,甚至text.father都行(文件vim写入*后缀)获取工作目录和缓冲区的工作状态,这个命令会告诉你哪些文件已经被修改、哪些文件已经被添加到暂存区、哪些文件是新添加的,以及哪些文件是未跟踪的。注意,你以上所有的操作都是在缓冲区里进行的,要真正的创建仓库必须使用git push。查找过程中按q退出进程。原创 2024-06-19 20:45:41 · 197 阅读 · 3 评论 -
漫话linux:进度条项目补充组件:旋转光标
这是一种覆盖的写法首先将下一个需要打印的位置放上#,并将下下个需要打印的位置放上>,这样就会在字符串的结尾保留一个>,当达到临界条件100时则防止将102位置的\0覆写掉,加一个判断语句。为了显示这个进度条一直在工作,可以添加一个旋转光标,就是在一个特定位置实现- \ - \ 的转化,以提示客户程序运行。通过函数指针回调展示进度(把processbar函数传进去)(通过回调显示进度)rate表示进度,其中表示方式为cur/total算出比例再*100的数组长度。原创 2024-06-18 17:47:32 · 190 阅读 · 3 评论 -
漫话linux:进度条项目
proCess.h(头文件以及函数声明和宏定义)proCess.c(函数主体)原创 2024-06-16 16:10:08 · 162 阅读 · 3 评论 -
漫话linux:倒计时项目
最后是main文件,解析一下,首先c语言输出到屏幕上的命令在c语言命令读取未到return 0的时候会被暂时存放在缓冲区,所以正常输出会先停顿几秒再输出全部的数字,而我们需要倒计时类似的输出,所以要在每次sleep后直接输出数字,也就是刷新缓冲区,就要使用fflush(文件流)的命令,而我们又希望数字都在一个位置而不使用\n,所以要使用\r打印,然后就是防止count>10的打印方式-(左对齐)和2(限制长度,如果count>100则换为3)2.缓冲区:c语言维护的一段内存。原创 2024-06-15 21:31:26 · 190 阅读 · 3 评论 -
漫话linux:makefile与make的配套操作代码
体现了依赖关系和依赖方法的层次性,make后面可以接指定的依赖关系和依赖对象来调用指定内容呢如make clean,以后编译多个文件需要make后面跟所有的文件名。一般而言,源文件的执行时间比可执行文件要早,而是否需要重新编译,一般在执行文件(.exe)的修该时间老于源文件(.c)表示源文件被动过,需要重新编译。以上为使用make代替gcc命令编译的操作,其中配套文件如下。清理项目(开头注意是四个空格)命令行:make clean。原创 2024-06-11 21:28:53 · 236 阅读 · 2 评论 -
漫话linux:项目自动化构建工具make/makefile
make是一个在Linux下广泛使用的自动化构建工具,它可以根据一个Makefile文件中的指令来自动执行编译、链接等操作,从而生成一个可执行文件或者库文件。通常情况下,使用make工具可以极大地简化代码的编译和构建过程。原创 2024-06-11 11:23:06 · 524 阅读 · 1 评论 -
漫话linux:gcc的使用
GCC是GNU Compiler Collection的缩写,是一款自由软件、跨平台的编译器。它支持多种语言,包括C、C++、Objective-C、Fortran、Ada等,可运行在多种操作系统上,如Linux、Windows、macOS等。GCC可以将源代码编译成目标代码,并链接成可执行文件。除此之外,GCC还提供了许多优化选项,可以对生成的代码进行优化,使程序的性能得到提升。原创 2024-06-10 10:05:57 · 931 阅读 · 1 评论 -
漫话linux:IDE的明星vim的基本操作
要写代码必须切换到插入模式(按一下i就可以进行模式切换),保存退出,从插入模式返回到命令模式(按esc),而退出必须从命令模式到底行模式(shift : wq)w表示保存,q表示退出,如果不想保存退出想返回到命令模式,直接esc。在命令模式下输入ctrl+ww即可更换当前操作的文件,光标在哪个文件,就是可以处理那个文件,对于每个文件只需要用我们之前学的操作处理就好,在某个文件的底行模式输入q就可以退出该文件。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为: “.vimrc”原创 2024-06-09 22:35:34 · 463 阅读 · 1 评论 -
漫话linux:linux工具yum
1.源代码安装:下载到程序的源代码, 并进行编译, 得到可执行程序,但是它存在多个缺点:1.需要自己寻找正确安装源2.源码由多个文件组成易丢失3.同一个软件有不同版本,需要自行寻找适配本地环境的版本4.用户要自己搭建环境如编译器和库2.rpm包安装:类似于windos的安装程序的安装包,是提前编译好的软件,可以直接安装,缺点:环境需要自己配置3.yum安装:解决了安装源、安装版本、安装依赖三个问题 ,最推荐的安装方式。原创 2024-06-09 20:26:07 · 614 阅读 · 1 评论 -
漫话linux:权限问题(以身份划分)
1.root:管理员级别,超级用户,基本不受权限限制2.普通用户:新建的用户(adduser新加用户),受权限限制,使用passwd+用户名设置密码即可,删除普通用户使用userdel+用户名3.所有用户都需要密码,即使多个普通用户都需要密码,输入密码password 都可以,但password whb只能输入root密码4.su指令切换用户:格式:su 用户名。原创 2024-06-09 15:48:19 · 589 阅读 · 1 评论