自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 【亲测可行】Mac上clion boost库的安装与使用

必须要加,-l boost_system -l boost_thread,否则会报错(不过不知道为什么,我这里不要写boost_thread,写了反而会报错)安装好以后boost目录在 /opt/homebrew/Cellar/boost/xxx版本 下,然后可以看到lib(库文件)和include(头文件)对应到我们这里应该是,这里1.84.0_1是homebrew安装的版本,读者可以自行查看。很多博客上关于boost库的安装与使用都有问题,所以自己写一篇文章来纠正一些错误。

2024-03-17 13:19:29 541

原创 【高通camera hal bug分析】高通自带相机镜像问题

如果我们不开启镜像Flip的值为0,所以这段函数的输出没有任何问题,经过调查后发现前面的函数(红色部分有问题,绿色部分没问题)首先打了两个log,一个是开启镜像的log,还有一个是没有开启镜像的log,如果我们开启镜像以后,观察开启镜像log发现。所以UpdateFlip没有起到作用,因为缺少对包名(com.zui.camera)的判断,加上即可解决此问题。, 这段代码走的没有任何问题,因为Flip的值等于1了。

2024-03-12 15:26:05 507

原创 【高通camera hal bug分析】相机录像的时候有水印,录像的过程中拍照无水印

首先打两份log,分别是拍照的log和录像的log,然后grep “watermark” -i,发现录像的log中framework层没有调用到hal层watermark部分的代码,拍照的log中hal层有走到watermark关键字,所以综上所述是framework的问题。

2024-03-12 15:23:13 364

原创 函数指针和函数指针数组

【代码】函数指针和函数指针数组。

2024-03-12 15:20:55 307

原创 redis主从复制【面试必看】

Redis 通过复制功能实现主节点的多个副本。主节点⽤来写, 从节点⽤来读. 这样做可以降低主节点的访问压⼒.复制⽀持多种拓扑结构,可以在适当的场景选择合适的拓扑结构。复制分为全量复制和部分复制。主从节点之间通过⼼跳机制保证主从节点通信正常和数据⼀致性。从机多了, 复制数据的延时⾮常明显.主机挂了, 从机不会升级成主机. 只能通过⼈⼯⼲预的⽅式恢复.

2023-12-09 23:01:25 1052

原创 redis事务【面试必看】

Redis 的事务和 MySQL 的事务概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执⾏。Redis 事务本质上是在服务器上搞了⼀个 “事务队列”。每次客⼾端在事务中进⾏⼀个操作,都会把命令先发给服务器,因此,Redis 的事务的功能相⽐于 MySQL 来说,是弱化很多的。只能保证事务中的这⼏个操作是 “连续的”,不会被别的客⼾端 “加塞”,仅此⽽已为了更好理解redis事务的概念,举一个例子:这种写法有一个问题就是多线程的时候会有并发的问题,需要加锁。

2023-09-14 15:00:33 118

原创 redis持久化策略【面试必看】

Redis 提供了两种持久化⽅案:RDB 和 AOF。RDB 视为内存的快照,产⽣的内容更为紧凑,占⽤空间较⼩,恢复时速度更快。但产⽣ RDB 的开销较⼤,不适合进⾏实时持久化,⼀般⽤于冷备和主从复制。AOF 视为对修改命令保存,在恢复时需要重放命令。并且有重写机制来定期压缩 AOF ⽂件RDB 和 AOF 都使⽤ fork 创建⼦进程,利⽤ Linux ⼦进程拥有⽗进程内存快照的特点进⾏持久化,尽可能不影响主进程继续处理后续命令。

2023-09-12 14:42:38 149

原创 高级IO(select、poll、epoll)

因此ET模式下,所有的fd、sock必须处于非阻塞模式。LT模式设阻塞模式不会受影响,但是也建议设置为非阻塞模式。

2023-08-31 23:57:36 221

原创 详解MAC帧、ARP、DNS、ICMP协议

比如新建了一个内网,如果一台机器A找机器B,封FRAME时(OSI的第二层用的数据格式),要封装对方的MAC,,源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是广播的。然后这个请求包在内网内被广播,当其他机器接到这个包时,用目的IP和自己的IP比较,不是的话就丢弃。B接到时,发现IP与自己的一样,就答应这个包的请求,把自己的MAC送给A。如果B是其他子网的机器,那么路由器会判断出B是其他子网,然后路由器把自己的MAC返回给A,A以后再给B发包时,目的MAC封装的是路由器的。而。

2023-08-31 23:44:13 998

原创 详解IP协议

在介绍IP协议之前,先抛出一个概念:IP地址的作用——定位主机,具有将数据从主机A跨网络传输到主机B的能力,有了,例如滑动窗口、拥塞控制等,,所以我们通常叫TCP/IP协议,有了这两个,就可以实现可靠的传输路由器: 即配有IP地址, 又能进行路由控制。

2023-08-31 23:41:03 242

原创 C++强制类型转换

这里监视窗口a可能会是3,原因是const变量,编译器认为变量不会被改,就把他放到寄存器里了,而这里的修改是修改内存的值,但是vs的监视器是从内存中读取,而cout是一个函数调用,从寄存器取。dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用。向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

2023-08-31 23:35:31 256

原创 C++11语法

使用初始化列表时,可添加等号(=),也可不添加。

2023-08-06 17:20:55 125

原创 详解TCP协议

可靠性:校验和序列号(按序到达)确认应答超时重发连接管理流量控制拥塞控制提高性能:滑动窗口快速重传延迟应答捎带应答其他:定时器(超时重传定时器, 保活定时器, TIME_WAIT定时器等)

2023-07-14 01:28:13 401

原创 详解UDP协议

在讲本篇文章之前,给读者介绍两个指令1.netstat:用来查看网络状态的重要工具语法:netstat [选项]2.pidof:查看服务器的进程id时非常方便,之前我们使用的命令是ps aux | grep 进程名语法:pidof [进程名]pidof 进程名 | xargs kill -9这个命令的意思是把pidfof 进程名的结果放到kill -9 后面。

2023-07-14 00:53:01 224

原创 HTTPS加密

前置知识:我们通常会把一篇非常大的文章变成固定长度的字符串,称为哈希摘要,常见的哈希摘要有,MD5等,对摘要进行加密就是。

2023-07-14 00:50:05 200

原创 网络套接字编程(三)(HTTP)

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,本质是基于TCP协议来进行文本设置完成协议通信。HTTP协议支持客户端——服务端模式,也就是请求与响应模式,且客户端需要以浏览器的方式访问服务端。

2023-07-14 00:47:49 2652

原创 网络套接字编程(二)(TCP套接字的编写+多进程版本+多线程版本+线程池版本)

这里就需要用的。

2023-07-14 00:36:08 935

原创 网络套接字编程(一)(UDP)

gitee仓库:https://gitee.com/WangZihao64/linux/tree/master/chat_udp。

2023-07-14 00:33:14 245

原创 计算机网络基础

在介绍网络之前,先讲一个概念,一台计算机的内部本质也是一个小型网络结构,CPU、内存、外设都是通过线连接起来的,并且它们之前也有协议,一台计算机各个功能用多台计算机构建起来,用网络及链起来,就有了存储集群的概念,各个存储集群合起来就是一个大型计算机这段话如果不理解没关系,等看完这篇文章在回过头来看看。

2023-07-14 00:30:23 152

原创 位图和布隆过滤器

gitee仓库:https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/BloomFilter。

2023-06-28 10:28:41 71

原创 图解红黑树

gitee仓库:https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/RBTree。

2023-06-28 10:26:07 66

原创 图解平衡二叉搜索树

注意:要提前记录60的平衡因子,60这个结点的平衡因子如果是-1,90的平衡因子就会+1,30、60的平衡因子是0,如果平衡因子是1的话,30的平衡因子会-1,60,90的平衡因子是0,但如果平衡因子是0的话,那么30,60,90的平衡因子也是0。上图在插入前,AVL树是平衡的,新节点插入到30的左子树(注意:此处不是左孩子)中,30左。如果是子树,可能是某个节点的左子树,也可能是右子树。插入和二叉搜索树一样,平衡因子的更新规律如上图。如果是根节点,旋转完成后,要更新根节点。

2023-06-28 10:20:34 73

原创 线程池+读写锁

线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,简单说:提前把线程创建好,等待任务的派发。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量需要大量的线程来完成任务,且完成任务的时间比较短。可同时处理多任务,多请求。有任务可以立即从线程池中调取线程取处理,节省了线程创建的时间。

2023-05-08 22:47:10 653

原创 线程同步、生产者消费模型和POSIX信号量

POSIX信号量相关接口都是在的头文件中。信号量是一个类型为sem_t的变量1.sem_init——初始化信号量sem:信号量pshared:0表示线程间共享,非零表示进程间共享value:信号量初始值成功返回0,失败返回-12.sem_destroy——销毁信号量sem:信号量成功返回0,失败返回-13.sem_wait——等待信号量等待信号量,会将信号量的值减1sem:信号量成功返回0,失败返回-14.sem_post——发布信号量。

2023-05-08 22:45:31 395

原创 多线程(线程同步和互斥+线程安全+条件变量)

任何时刻,保证,通常对临界资源起到保护作用多个线程对一个共享变量进行操控时,会引发数据不一致的问题。此时就引入了互斥量(也叫互斥锁)的概念,来保证共享数据操作的完整性。在被加锁的任一时刻,临界区的代码只能被一个线程访问。为了更好的阐述这个概念,这里用一个抢票代码去演示运行结果如下:我们发现票到负数了还会继续执行--有可能在你执行到第二条汇编的时候,还没来得及拷贝给内存,就别切换走了,就会导致减到负数,因为别的线程在读取的时候内存中的ticket还是1。

2023-05-08 22:31:40 815

原创 多线程【线程概念+线程控制】

在谈多进程之前,我们在谈一谈页表,在语言中:char* str=”hello world”;*str=”H”;运行时会报错,原因在于:字符串在已初始化数据区和代码区之间的,需要写的时候,我们需要对str进行虚拟地址和物理地址的转换,查到了物理地址,继续查页表,然后查到了只有R权限,然后你的操作是写操作,MMU会将当前行为终止,向硬件报错,OS识别到硬件报错,把硬件操作转换为信号(段错误,11号信号),给进程发送11号信号,进程就要处理信号,信号的默认动作是终止,所以就终止了。

2023-05-06 00:33:21 769

原创 图解二叉搜索树

14这个结点只有左孩子,我们只需要让10这个结点的右孩子指向14的左孩子即可,第3种情况的处理方法和第2种是一样的(也包括第一种),如果是这样的一棵树,并且我们需要删除头节点,就需要单独处理。首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情。在处理上我们的情况1可以和情况2,3合并起来,所以这里着重理解2,3,4这三种情况。从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。最多查找高度次,走到到空,还没找到,这个值不存在。2.要删除的结点只有左孩子结点。

2023-04-11 15:58:38 541

原创 对信号的认识

问题:信号什么时候被处理的?首先,不是立即被处理的。而是在合适的时候,这个合适的时候,具体指的是进程从用户态切换回内核态时进行处理何为用户态?内核态?处于⽤户态的 CPU 只能受限的访问内存,用户的代码,并且不允许访问外围设备,权限比较低处于内核态的 CPU 可以访问任意的数据,包括外围设备,⽐如⽹卡、硬盘等,权限比较高操作系统怎么知道你处于什么状态?操作系统中有一个cr寄存器来记录当前进程处于何种状态,0表示内核态,3表示用户态进程空间分为用户空间和内核空间。

2023-04-06 23:41:14 468

原创 进程间通信【system V】

举例:我们去电影院,想要获得这个座位,需要预定对吧?电影院有100个座位,count=100,预定以后count- -,取消预定就count++,信号量就是这样的存在,当我们需要某种资源的时候,我们可以进行预定资源(

2023-04-06 23:29:39 174

原创 进程间通信【管道】

管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。它的特点是单向传输数据的,先进先出。例如:cat file.txt | head -1cat是一个进程,这个进程先处理,然后将处理后得到的标准输出到管道中,再由head进程通过标准输入将管道中的数据读出,再进行处理。进程具有独立性,通信的成本不低———1.OS需要直接或者间接给通信双方提供“内存空间“ 2.要通信的进程必须看到一份公共的资源匿名管道:父子两进程互相通信功能:创建一无名管道。

2023-04-06 23:25:43 939

原创 linux动静态库

分别使用静态链接和动态链接编译生成两个可执行程序,比较两个程序的大小使用gcc静态链接编译时,命令要带上**-static** 选项,如下:如果报错可以执行如下指令:yum install glibc-static可以用file命令去查看文件链接属性可以使用ldd命令查看可执行程序的依赖库,动态链接生成的可执行程序才有依赖库,静态链接升序的可执行程序不依赖任何库文件,因为库文件的代码已经复制进可执行程序了。

2023-04-06 23:19:20 388

原创 linux软硬链接

因为没有给硬链接分配独立的inode,既然没有创建文件,那么你一定没有自己的属性集合和内容集合,你用的一定是别人的inode和内容。并且log.txt的删除虽然影响了软链接,但是他的inode,文件属性等还是正常存在,这个软链接就相当于windows下的快捷方式。这是我们向log.txt写入点东西以后,会发现硬链接和log.txt文件大小会发生变化,但是软链接没有。硬链接的测试,在test5底下创建一个文件以后他的硬链接数字为2,这是为什么呢?删除:unlink 硬链接名/rm 硬链接名。

2023-04-06 23:14:14 287

原创 缓冲区的理解

缓冲区的本质就是一段内存,如果我们要把数据传送给磁盘,并不是直接交给磁盘,由进程交拷贝给缓冲区,这个缓冲区是语言级别的(例如C语言指定的),会定制自己的刷新策略,例如:立即刷新,行刷新,缓冲区满在刷新,但是也有例外,比如:进程退出一般都要刷新缓冲区或者用户强制刷新等等。利用之前学的知识,可以写一个属于自己的文件函数,里面封装了系统调用。但是我们重定向的时候系统调用只有一次,C接口的函数有多次。这是一个行缓冲,和我上面的结论一致。

2023-04-06 23:08:53 321

原创 文件fd【shell完善】

那么重定向的功能就可以把shell再完善一下,这样就可以支持ls -l > log.txt ls-l >> log.txt cat < log.txt的功能。文件内有3个特定的文件标识符,stdin,stdout,stderr所以在我们打印fd的时候会发现从3开始,不过当我们close的时候会有如下发现。以上我们可以得到一个规律,即那一个被close掉,fd就会去占用它。linux下一切皆文件。

2023-04-06 23:02:52 435

原创 深入理解C语言的文件【系统编程】

几个概念:我们先复习一下常用的几个文件打开方式接口介绍man 2 open查看这个flag就是位图,所以在我们使用的时候只需要|上各种条件我们就可以实现各种效果fclose对应close->man 3 close查看我们正常创建会遇到如下情况:log.txt权限是乱码主要原因在于我们创建文件默认权限是666目录权限是777,然后&~umask,创建文件默认权限为什么是666呢?原因就在于我们需要自己设置mode,也就是int open(const char *pathname, int flags,

2023-03-14 16:36:33 451

原创 二叉搜索树C++实现

14这个结点只有左孩子,我们只需要让10这个结点的右孩子指向14的左孩子即可,第3种情况的处理方法和第2种是一样的(也包括第一种),如果是这样的一棵树,并且我们需要删除头节点,就需要单独处理。首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情。在处理上我们的情况1可以和情况2,3合并起来,所以这里着重理解2,3,4这三种情况。从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。最多查找高度次,走到到空,还没找到,这个值不存在。2.要删除的结点只有左孩子结点。

2023-03-12 17:24:15 163

原创 Linux进程程序替换及制作简易的shell

/指针数组int main()while(1)//输出提示符printf("用户名@主机 当前路径# ");//刷新缓冲区,因为没有\n不会刷新缓冲区//获取用户输入,预留一个\0,所以需要-1assert(s!=NULL);//// 保证在release方式发布的时候,因为去掉assert了,所以s就没有被使用,而带来的编译告警, 什么都没做,但是充当一次使用(void)s;//这里会把用户的\n也输入进去,就会有2个\n//清楚最后一个\n//我们输入的是。

2023-03-11 15:23:17 441

原创 Linux回收僵尸进程

在我们介绍本篇文章之前,我想介绍一下退出码,还记得C语言中main函数中都有return 0嘛,这个return 0就是退出码,我们执行程序无非就三种情况:1.执行结束,和预期一致 2.执行结束,和预期不一致 3.执行结束前,程序出错如果子进程终止,但是父进程没有做任何操作会导致子进程一直处于这种状态。例如我们在main函数里面写return 10,使用**echo $?**可以查看到退出码,不过我们只能使用一次,读者可以试试使用ls之后在使用echo $?那么这个退出码怎么获取呢?

2023-03-11 14:44:07 579

原创 C++虚表的打印

运行以下代码后会发现Derive的func3(虚函数)放第一个继承的类里面。想要获得这个表我们需要取得头4/8个字节。虚表是一个函数指针数组。

2023-03-11 14:44:00 209

原创 从C到C++【多态】

delete p2;return 0;如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。

2023-03-09 16:14:30 385

空空如也

空空如也

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

TA关注的人

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