Linux
文章平均质量分 90
今天也要写bug、
编程三问:xx是什么?为什么要有xx?xx是怎么实现的?
展开
-
C++定时器和时间轮
定时器和时间轮原创 2022-09-06 22:58:17 · 2112 阅读 · 1 评论 -
基于链表的线程池----增加线程退出以及扩容和减容
线程池原创 2022-09-04 21:30:34 · 588 阅读 · 0 评论 -
守护进程的实现
通过使进程不再是会话组长来实现,再一次通过fork创建新的子进程,使调用fork的进程退出。另外再补充一点,既然bash退出的时候会向所有会话组的进程发送SIGHUP信号,那只需要捕捉这个信号,让其不执行原来的动作,就不会退出了。调用fork或vfork生成一个进程,然后父进程退出。setsid()调用成功后,返回新的会话ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。可以看到守护进程和它的bash不在同一个进程组中,因此bash退出并不会影响守护进程。原创 2022-08-20 19:14:35 · 691 阅读 · 1 评论 -
Reactor
事实上,Reactor 模式也叫 Dispatcher 模式,即 I/O 多路复⽤监听事件,收到事件后,根据事件类型分配(Dispatch)给某个进程 / 线程。实现简易计算器的业务:客户端发来一段字符串,格式为"a+bXc-dX",X主要用来分隔表达式,防止出现“粘包”问题,计算完成之后,将结果发回去,也用X进行分隔。Reactor 翻译过来的意思是「反应堆」,这⾥的反应指的是「对事件反应」,也就是来了⼀个事件,Reactor 就有相对应的反应/响应。Reactor 的数量可以只有⼀个,也可以有多个。..原创 2022-08-09 00:44:17 · 388 阅读 · 0 评论 -
读者写者模型---读优先与写优先
Linux线程中写过生产者消费者模型,这次研究读者写者模型。文章目录读者写者模型遵循的规则读优先写者优先读者写者模型遵循的规则读者-写者模型同样遵循321规则:写-写互斥,即不能有两个写者同时进行写操作。读-写互斥,即不能同时有一个线程在读,而另一个线程在写。读-读允许,读者和读者之间没有关系,即可以有一个或多个读者同时读。读优先如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。而此时写者正在被阻塞,只有所有的读者都读完,写者才会被唤醒。//读者优原创 2022-05-24 22:59:21 · 1574 阅读 · 2 评论 -
Linux高级IO
文章目录五种IO模型阻塞IO非阻塞IO信号驱动IO多路转接IO异步IO五种IO模型内存和外设进行沟通的动作叫做IO。在网络层面,数据往网络里写的本质是将数据从内存写到网卡设备上,从网络里读的本质是将数据从网卡设备读到内存中。任何IO过程,都要包含两个步骤,第一是等待, 第二是拷贝。而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间。所以高效IO的本质是, 尽可能地减少等待的比重。读 recv/recvfrom: 等待内核的接收缓冲区当中有数据来(等待IO过程)、接收缓冲区之中有了数原创 2022-04-17 17:06:31 · 2527 阅读 · 3 评论 -
20 Linux线程池
文章目录线程池线程池的概念基于队列的线程池实现代码进程池线程池存在的价值线程安全的单例模式饿汉方式实现单例模式懒汉方式实现单例模式各自优缺点:常见的锁STL中的容器是否是线程安全读者写者问题线程池线程池的概念简单来讲,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放回池中,以供后面的任务使用。当池子里的线程全都处理忙碌状态时,线程池中没有可用的空闲等待线程,此时,根据需要选择创建原创 2021-11-01 00:20:03 · 972 阅读 · 3 评论 -
19 POSIX信号量
文章目录POSIX信号量的概念初始化、释放、等待、发布信号量基于环形队列的生产消费模型代码实现POSIX信号量的概念POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。信号量的本质是一个描述临界资源有效个数的计数器。初始化、释放、等待、发布信号量#include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int va原创 2021-10-30 12:07:08 · 705 阅读 · 0 评论 -
18 Linux线程
文章目录一、线程的基础概念1.1. 线程是什么在Linux中没有真正意义上的线程,线程是用进程模拟的,数据结构也是用的task_struct1.2. 线程的优点1.3. 线程的缺点1.4. 线程的用途二、线程的操作2.1. 创建线程2.2. 线程的异常2.3. ps -aL查看轻量级进程2.4. 获取当前线程的线程ID2.5. 线程的终止(1)从线程函数return(2) 调用pthread_exit() 终止自己(3) 调用pthread_cancel终止同一进程的另外一个线程2.6. 线程的等待2.6.原创 2021-10-29 19:38:19 · 5008 阅读 · 5 评论 -
17 Linux进程信号
由于操作系统是进程的管理者,因此所有信号都必须经过操作系统发出。文章目录一、信号的概念1.1.ctrl c发送前台信号1.1.1.用signal系统调用接口验证ctrl c是信号SIGSTOP和SIGKILL不可捕获1.1.2.小结二、信号的常见处理方式三、信号的产生3.1.通过终端按键产生信号3.2.通过调用系统函数向进程发信号3.2.1.kill3.2.2.raise3.2.3.abort3.3.由软件条件产生信号3.3.1.alarm3.3.2.利用alarm验证IO对效率的影响3.4.由硬件异常原创 2021-10-24 11:13:44 · 1874 阅读 · 11 评论 -
16 进程间通信
要让两个进程实现通信,前提条件是让两个进程看到同一份资源。文章目录一、进程间通信1.1.进程间通信的目的1.2.进程间通信分类二管道2.1.Linux下的管道2.1.1.父子进程之间的管道2.1.2.为什么stdin,stdout,stderr会被默认打开?2.1.3.打开的文件struct file为什么不会被继承2.2.匿名管道2.3.管道的读写规则2.3.1.进程间同步当没有数据可读时,读端阻塞当管道满的时候,写端阻塞2.3.2.关闭文件描述符关闭写端,读取端读取到文件末尾,read返回0值关闭读原创 2021-10-21 13:05:22 · 352 阅读 · 2 评论 -
15 生成动静态库
之前在gcc/g++了解过动静态库,此次对其进一步理解并且自己制作动静态库。另外,库的名称要去掉前缀和后缀,如:libc.so -> c库,要去掉前缀lib,去掉后缀.so,.a文章目录动态库和静态库生成静态库生成动态库动态库和静态库补充内容:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一般默认生成的可执行程序都是动态的,动态库体积小,运行时加载,只原创 2021-10-17 23:13:06 · 406 阅读 · 1 评论 -
14 软硬链接
文章目录文件系统inode软硬链接软连接硬链接软硬链接的区别总结文件系统文件=属性+内容在Linux中,一般把属性数据集合在一起,取名为inode,而内容则保存在block中。一般一个文件只有一个inode,但有多个数据块block。但是硬盘当中有多个文件,所以就会有多个inode和block,操作系统会将这些inode管理起来,形成inode表。所以文件系统其实是分区的整体化描述,比如基本情况,空间一共多大,inode,block等信息。所以使用ls -l的时候看到的除了看到文件名,还看原创 2021-10-17 17:01:52 · 1338 阅读 · 2 评论 -
13 Linux下的基础IO
文章目录C语言中的文件接口C语言中的文件接口在C语言文件操作时学过文件接口C语言中的文件接口原创 2021-10-17 12:09:45 · 3652 阅读 · 13 评论 -
12 Linux进程的控制
文章目录一、fork的补充1.1.写时拷贝1.2.fork调用失败的原因二、进程终止2.1.退出码2.2.正常退出returnexit_exit和exit的区别2.3.异常退出三、进程等待3.1.进程等待的方法waitwaitpidstatus3.2.创建多进程3.3.非阻塞等待子进程3.4.总结四、进程程序替换4.1.进程替换的函数4.2. execve五、实现一个简单的shell六、补充和总结内容一、fork的补充在之前已经了解了fork函数,这个函数是以父进程为“模板”创建子进程。父子进程的所有原创 2021-10-13 10:41:42 · 1549 阅读 · 1 评论 -
11 进程地址空间
研究背景:kernel 2.6.32 32位平台文章目录进程地址空间虚拟地址为什么要有虚拟地址补充内容进程地址空间在之前进程地址空间我们学习的是用户空间:可以通过下面的代码验证空间分布:#include<stdio.h>#include<stdlib.h> int g_val=100; int g_unval; int main(int argc,char*argv[],char*env[]) { printf("原创 2021-10-11 14:16:53 · 326 阅读 · 1 评论 -
10 Linux环境变量
在Linux下,命令实际上也是一个放在磁盘中的可执行文件,要执行一条命令一般分为两步:1.找到这条命令 2.运行它的可执行文件文章目录一、什么是环境变量二、常见的环境变量PATHHOMESHELL三、环境变量的组织方式四、使用代码获取环境变量五、通过系统调用函数获取环境变量六、环境变量通常是具有全局属性的七、补充几个和环境变量相关的命令总结:一、什么是环境变量环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代原创 2021-10-10 17:53:27 · 1382 阅读 · 6 评论 -
09 Linux进程的概念
文章目录一、什么是进程二、进程管理2.1.描述进程--PCB2.2.查看进程2.2.1.使用ps命令查看2.2.2.通过系统目录查看三、通过系统调用函数获取进程标示符PID和PPID四、fork创建子进程4.1.补充内容五、进程状态R 可执行状态S 可中断睡眠状态D 不可中断睡眠状态T/t 暂停状态和跟踪状态X 死亡状态三种进程的基本状态和切换补充内容:echo $?六、kill杀死(中断)进程七、Z 僵尸进程7.1.僵尸进程的危害八、孤儿进程九、进程优先级9.1. ps -l查看优先级9.2. PRI和N原创 2021-10-09 22:43:25 · 3015 阅读 · 12 评论 -
08 冯 • 诺依曼体系结构和操作系统
文章目录冯 • 诺依曼体系结构为什么需要存储器(内存)操作系统冯 • 诺依曼体系结构一个程序在运行起来的第一件事情是将程序加载到内存当中。笔记本、服务器等计算机,大部分都遵守冯诺依曼体系:运算器:对数据进行算术/逻辑运算。控制器:是计算机的指挥中心,负责决定执行程序的顺序,给出执行指令时机器各部件所需要的操作控制命令。进行非数据性的逻辑控制,比如什么时候将数据加载到内存。运算器与控制器统称为中央处理器(CPU)。常见的输入设备:键盘、鼠标、摄像头、麦克风、网卡、硬盘等。常见的输出设备:显原创 2021-10-07 23:02:13 · 857 阅读 · 3 评论 -
07缓冲区与回车\r和换行\n
文章目录缓冲区回车\r和换行\n缓冲区缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。所以对于下面的程序:程序会先休眠5秒,然后打印字符串hello之后结束运行。这是因为在执行printf时,字符串hello被写入到了C程序的缓冲区中,但并没有输出到显示器上,执行完sleep后,缓冲原创 2021-10-02 23:43:45 · 1286 阅读 · 3 评论 -
06项目自动化构建工具-make/Makefile
make是一个命令,makefile是一个文件,通常该文件会在当前工作目录下存放。在VS当中,项目管理(多文件管理)是VS帮我们自动管理的。但是在Linux中,维护项目文件关系的工作(比如同时编译链接多个文件),需要让make、makefile来完成。所以makefile带来的好处就是“自动化编译”,一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。文章目录依赖关系和依赖方法使用Makefile实现多文件编译使用Makefile清理项目依赖关系和依赖方法如果对A原创 2021-10-02 21:24:40 · 745 阅读 · 2 评论 -
05gcc/g++和gdb使用
一般生成C/C++可执行程序需要经过以下四个步骤:1.预处理(头文件展开、去注释、宏替换、条件编译)。2.编译(C代码翻译成汇编语言)。3.汇编(汇编代码转为二进制目标代码)。4.链接(将目标文件和系统库进行链接形成可执行程序)。gcc/g++就是用来实现这四个步骤的,gdb则是一个调试器,用来debug。Linux默认生成的可执行程序是动态链接且以release方式发布的!文章目录编译器gcc/g++预处理编译汇编链接动态库和静态库调试器gdb调试显示断点退出gdb补充内容编译器gcc/g++原创 2021-10-02 16:39:34 · 1051 阅读 · 5 评论 -
04 vi/vim文本编辑器
vi/vim都是多模式的文本编辑器,可以进行代码编写。不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。一个集成开发工具比如VS2019具有:编写代码、编译代码、debug代码等功能,而vim就是Linux下负责编写代码的工具。文章目录vim常用的三种模式vim切换模式的基本操作vim简单配置vim命令模式常用的命令移动光标删除复制粘贴剪切替换大小写转换撤销和重原创 2021-10-01 22:20:08 · 504 阅读 · 4 评论 -
03软件包管理器rpm和yum
yum相当于Linux下的一个应用商店。能够帮助我们查找、下载、安装软件yum一般需要用root用户来执行或者给普通用户使用sudo权限提升,因为安装软件时需要向系统目录中写入内容,如果没有写的权限或者写入的权限不够高就会写入失败进而导致安装失败。文章目录一、Linux安装软件常用的三种方式二、rpm2.1.rpm包的查找指令2.2.rpm包的其他查询指令2.3.卸载rpm包2.4.安装rpm包三、yum是什么3.1.yum查找、安装和卸载四、安装lrzsz并实现Linux与主机互传文件五、yum安装原创 2021-10-01 16:23:39 · 684 阅读 · 4 评论 -
02Linux权限
超级用户(root用户)是不受权限限制的,权限是用来限制普通用户的。文章目录一、Linux下的两种用户1.1.添加普通用户并修改密码以及删除用户1.2.切换用户1.3.使用sudo指令提升用户权限二、Linux下的权限2.1.文件的属性和权限2.1.1.连接数2.1.2.块(block)2.1.3.文件类型2.1.4.文件权限2.2.文件权限的表示方法2.3.修改文件的权限2.4.修改文件的拥有者和所属组2.5.目录的权限2.5.1.粘滞位2.6.修改文件的权限掩码一、Linux下的两种用户Linu原创 2021-09-28 11:44:26 · 1087 阅读 · 11 评论 -
01Linux常用指令
所有的指令不要强制记忆,选项要多多查一下,多多练习使用即可。文章目录一、Linux简单介绍1.1.Linux的目录结构1.2.常见的具体目录结构/bin/sbin/root/lib/etc/usr/boot/tmp/dev/media/mnt/opt/usr/local/var1.3.路径1.4.空文件的大小二、常用的指令whoamilspwdcdtouchmkdirrmdirrmmancpmvechocattacmorelessheadtaildatecalfindwhichgrepzip压缩和unzi原创 2021-09-27 16:38:05 · 18588 阅读 · 27 评论
分享