自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux--信号

信号

2022-12-25 20:13:12 782

原创 Linux--进程间通信

管道、system V

2022-12-19 18:26:34 554 2

原创 C++多态(2)

抽象类,子类与虚表

2022-11-07 19:57:36 699

原创 C++多态(1)

多态构成条件、虚函数重写细节

2022-11-06 19:36:00 1382

原创 Linux--环境变量和进程地址空间

环境变量和进程地址空间

2022-10-18 23:15:56 585

原创 对于网络IO的理解

首先服务端将本机地址和端口bind在listensock上,再用listensock去将这个套接字设置为listen状态,然后调用accept,进入阻塞状态。如果此时有客户端请求连接,就是第一次握手的开始。客户端会先调用connect来申请连接:connect调用时是发送SYN,然后服务端返回SYN+ACK,然后客户端的connect返回,发送最后一个ACK,服务端接收到以后accept返回,开始进行read。这里的过程,服务端会被阻塞两次,一次是accept,一次是后续的read。

2024-03-05 10:33:54 470

原创 服务器未启动而端口进程仍在运行如何查看并杀死

比如这里的8080,我们此时并未启动服务器,但是它却正在运行,这会导致服务器刚启动就秒挂。如果没有日志的话会让人有点疑惑,这种情况可能是之前运行了该进程但是服务器那边没有正确地关闭导致的。

2024-02-01 18:15:39 432

原创 pid,ppid,pgid,sid进程间关系

我们是在 bash shell 下执行 ps 和 less 命令的,所以 ps 和 less 命的父进程是 bash 命令。这3条命令创建了1个会话 (SID是1943)和2个进程组 (PGID分别是 1943 和 2298)。bash 命令的 PID、PGID 和SID 都相同,很明显它既是会话的首领,也是组 1943 的首领。Linux 下每个进程都隶属于一个进程组,因此它们除了 PID 信息外,还有进程组 ID(PGID)。进程组将一直存在,直到其中所有进程都退出,或者加入到其他进程组。

2023-11-09 15:22:52 247

原创 为什么要有override

因为逻辑是用户编写的,那么肯定会有遗漏的地方,那就要规则来限制。就比如多态,都知道条件之一是子类重写了父类的虚函数,但是如果子类没有严格遵守这个规则,就无法达到目的。这其实挺难发现的,因为编译器也并不会去给我们指出来,毕竟多态也并不是一定要实现。刚开始看会以为这是个多态,但其实这并不是,会打印aaa而不是bbb。因为aaa函数并没有被严格地重写:const属性丢失了。还有一种好处是:能让人知道这个函数是重写并且是用作多态的。

2023-09-17 22:47:31 325

原创 MySQL事务

当我们执行一系列操作时,这些操作要么全部执行成功,要么全部回滚(撤销),就像完成一项任务一样。这个整体的执行过程就是一个事务。假设你要将100元从账户A转到账户B,这个过程可以分为两步:首先从账户A中扣除100元,然后将这100元添加到账户B中。如果这两个操作只有一个成功,另一个失败,那么转账就是不完整的。事务机制的目标就是确保在转账过程中,要么这两个操作都成功,要么两个操作都失败,保持数据的一致性。

2023-09-17 17:12:18 162

原创 MySQL里的查看操作

这个指的是列出当前表有什么结构。

2023-09-16 12:09:04 427 1

原创 表的内连接和外连接

表的连接是SQL中的一种操作,用于将两个或多个表中的数据按照某个条件进行关联。

2023-09-11 22:47:38 219

原创 MySQL复合查询(查询直接看这里)

在这个查询中,使用了表达式 sal * 12 + IFNULL(comm, 0) 来计算年薪。IFNULL(comm, 0) 函数用于确保佣金字段的值不为空,如果为空,则将其替换为零。然后FORMAT(AVG(sal), 2):对平均薪水进行格式化,保留两位小数;然后MAX(sal)找出每个部门的最高薪水。更标准的解释就是where是对行与行之间进行比较筛选,而max是对整个表的数据进行筛选。输出的有:deptno, format(avg(sal), 2) , max(sal)

2023-09-11 22:05:26 148

原创 最长连续递增子串

【代码】最长连续递增子串。

2023-09-11 21:34:09 197

原创 约瑟夫环问题

这里就是说明每一轮往回推的时候,补上上一轮被杀的元素,再向右移m位使全部元素回归上一轮原位(杀一个相当于这个数前面的数都拼接在了当前列表的最后边,相当于是左移了,然后被杀的元素的下一个作为被杀目标),同时要保持右移的时候下标别越界。首先,x一定是最后的下标为0。那么我们可以倒推回去上一轮筛选的时候,x的下标是多少,以此类推我们就能推到第一轮去,从而知道x最初的坐标。以此递归下去最终就得到x第一轮的坐标。x+m(存活人右移m位,先回归原位)(此时的x是最终存活人的下标)(x+m)%n(取模防止越界)

2023-09-11 15:24:09 75

原创 表的约束类型

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。主键约束防止两个学生具有相同的学生ID,确保每个学生都有一个唯一的身份。某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。它用于在显示数值类型的列时,将数值前面的空位用零填充,以达到指定的位数。,以标识和区分表中的每个记录。

2023-09-10 17:25:20 92

原创 IO多路转接poll和epoll

假设你是一家电商平台的客服人员,每天需要处理数千个用户的咨询和请求。你需要实时地回答用户的问题、处理订单、解决客户投诉等。这个过程中,你能同时处理的客户请求有限,因为人的处理速度是有限的。这时,你可以将每一个用户的请求看作是一个连接,在处理用户请求时,可以采用以下两种不同的方式:你会不断地询问每一个用户是否有新的问题或请求,等待他们的回应。这样做会造成你需要不停地轮询每一个用户,即使他们没有新的请求。这种方式效率低下,容易出现资源浪费。

2023-09-06 17:34:26 89

转载 epoll与select、poll的对比

epoll的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符,虽然epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。造成的结果就是,随着fd的增加,select和poll的效率会线性降低,而epoll不会受到太大影响,除非活跃的socket很多。,而select采用fd标注位来存放,所以select会受到最大连接数的限制,而poll不会。select和poll的动作基本一致,

2023-09-06 16:30:28 29

原创 IO多路转接select

当有新的连接请求到达时,select 函数会返回监听套接字的就绪状态,然后可以使用 accept 函数接受连接请求并创建新的套接字来处理该连接。fd_set是一个位图结构,可以理解为一个由比特位作下标(第几个比特位就代表第几个fd)组成的数组,如果取fd_set的长度为1字节,那么这个结构可以表示8个比特位,也就是8个fd。与read, write, recv, send本身的等待功能不同的是,这些函数的等待只能传入一个fd,而select可以传入多个fd,也就是能够同时等待多个fd。

2023-09-06 12:28:48 67

原创 非阻塞IO

其中errno=11,代表的是底层数据未就绪,而不是读取出错。这个11被重定义成了宏,叫做EWOULDBLOCK或者EAGAIN,从名字上看代表着再试一次。对于一个文件描述符,默认情况下都是阻塞的,fcntl是一个将fd设置为非阻塞的函数。诸如此类函数出错返回时,都会将errno变量设置,用于表明出错原因。对于cmd,目前需要的参数有cmd=F_GETFL或F_SETFL。那么如何甄别是真的出错 or 没有数据?一直阻塞住直到你输入数据。

2023-09-05 16:39:23 37

原创 MySQL索引

需要注意的是,索引并非越多越好,过多的索引会占用存储空间,增加索引维护的开销,并可能降低写操作的性能。常见的索引类型包括主键索引、唯一索引、普通索引、全文索引等,每种索引类型都有其适用的场景和特点。但其实它们是同一个,相当于共用一个索引,用的都是同一个B+树,并且默认以第一列name作为索引,删除索引name以后就会两个索引都被删除掉。索引的工作原理类似于字典中的索引,当我们查找字典中的某个词时,不需要逐个翻开每一页,而是直接通过索引找到对应的页面。– 在创建表的最后,指定某列或某几列为主键索引。

2023-08-04 16:11:32 99

原创 表的内连接和外连接

在上面的示例中,使用 LEFT JOIN 进行左外连接,返回所有的 Customers 表中的行,以及与 Orders 表中的 CustomerID 匹配的 OrderID。外连接是用于获取两个表中匹配和不匹配的行的连接方式。内连接是最常用的一种表连接方式,它通过匹配两个或多个表中的共享列,将满足连接条件的行组合起来。右外连接(Right Outer Join):返回右表中的所有行以及与左表匹配的行。左外连接(Left Outer Join):返回左表中的所有行以及与右表匹配的行。

2023-08-02 23:09:17 240

原创 什么是死锁,怎么避免死锁

死锁(Deadlock)是指在并发系统中,两个或多个进程或线程因互相等待对方释放资源而陷入无限等待的状态,无法继续执行下去。当死锁发生时,系统无法提供所需的资源,导致进程或线程无法继续执行,造成系统的停滞。互斥条件(Mutual Exclusion):一个资源一次只能被一个进程或线程占有,其他进程或线程必须等待。请求与保持条件(Hold and Wait):一个进程或线程在持有至少一个资源的同时,还可以请求其他进程或线程占有的资源。

2023-08-02 09:51:43 97

原创 C++11新特性

比如:重载了两个函数,参数分别是int和int*,当调用函数的时候,NULL就不会匹配到int*,而是匹配到int,这就是C语言宏定义NULL值带来的问题。例如C++11之前没有右值引用,所以形参都是定义成T& x这样的类型,这种左值引用是无法接收右值参数的,现在有了右值引用,就可以把参数改为const T& x,这样既可以接收左值又可以接收右值。需要注意的一点是,什么时候会调用移动构造是通过调用的对象来决定的,如果移动构造和拷贝构造同时存在,就看这个赋值对象是左值/右值,进行匹配拷贝/移动构造。

2023-07-29 11:05:26 179

原创 网络中的一些概念对比

3.内核空间与用户空间数据复制:在传统的poll中,需要将所有准备好的事件拷贝到用户空间,这会带来额外的开销。而epoll利用了内存映射(mmap)技术,将准备好的事件直接存储在内核空间的缓冲区中,从而避免了数据复制的开销。而epoll使用了回调机制,只有当文件描述符上发生了感兴趣的事件时,才会通知应用程序,避免了遍历所有文件描述符的开销。5.更详细的事件类型:epoll提供了更多精细化的事件类型,例如可读、可写、错误等,相比之下,传统的poll只提供了可读和可写两种事件类型。HTTP是明文传输,数据以。

2023-07-22 17:19:56 180

原创 智能指针是如何实现的

而控制块里的资源指针是通过智能指针内部管理的,通常不会被改编,指向原共享资源。资源指针是指向动态分配的资源(如堆上的对象)的原始指针,也就是shared_ptr所管理的对象或者资源。而对于对象里的资源指针,一个比较大的作用是提高访问速率,可以通过对象提供的操作接口,不用每次都从控制块里去访问。智能指针是通过控制块里的资源指针访问共享资源的,所以缺少它将导致无法访问到共享资源。,因为两个资源指针的指向不一定是一样的,尽管大多数情况下是一样的,原因是。它的内部有两个指针,资源指针和控制块指针。

2023-07-22 10:34:27 90

原创 linux常见命令

7.mv:移动文件和目录,也可用于重命名文件和目录。11.chmod:修改文件或目录的权限(访问控制)。9.touch:创建空文件或更新已有文件的时间戳。12.chown:修改文件或目录的所有者。13.chgrp:修改文件或目录的所属组。10.grep:在文件中搜索指定模式。14.find:根据条件搜索文件。15.man:查看命令的帮助手册。4.mkdir:创建目录。5.rm:删除文件或目录。6.cp:复制文件和目录。8.cat:显示文件内容。

2023-07-20 17:11:53 116

原创 C++中一些常见的概念区别

重载是同一个类中定义多个具有相同名称但参数列表不同的方法。它们的特点就是方法名相同但是参数列表不同,并且和返回值类型没有关系。具体的参数列表区分方法就是参数类型、个数和顺序来区分。更为重要的一点是,参数个数必须相同,因为这是作为同一个函数的前提,参数个数不同叫做两个函数。重写是针对子类和父类来说的,就是子类重新定义了父类中的虚函数。子类中满足三同(函数名、参数、返回值)的虚函数,叫做重写(覆盖),如果子类重写了父类的虚函数,就会在子类的虚函数表写入新的虚函数地址;

2023-07-20 17:10:15 48

原创 C和C++中const的用法区别

这个具体的实现方法是:C中如果用const修饰一个变量,如果你在编译期间对其进行修改,编译器会进行检查,并且能够检查出来,但是只会进行警告,并不会阻止程序的运行。而C++中则是直接将初始化的值直接嵌入到生成的机器码中(这是一种优化方式),就相当于所有用到该常量的地方已经全部被定义成某个值了,这样的话常量的值在编译期间就已经确定下来了。

2023-07-19 16:31:55 594

原创 关于GDP调试

说出一些常见的指令break(或缩写为b):设置断点,例如 b main 在 main 函数处设置断点run(或缩写为r):运行程序。step(或缩写为s):单步执行程序,进入函数内部。next(或缩写为n):单步执行程序,跳过函数内部。continue(或缩写为c):继续执行程序,直到下一个断点或程序结束。print(或缩写为p):打印变量的值,例如 p x 打印变量 x 的值。backtrace(或缩写为bt):显示当前调用堆栈。watch:设置观察点,当指定变量的值发生变化时中断程序

2023-07-19 16:04:27 826

原创 关于线程同步互斥

这两个操作在线程同步中是相辅相成的,因为条件变量的等待唤醒机制是不提供线程访问限制,那就会造成最开始的数据竞争的结果,所以需要互斥锁。比如某一个线程在释放锁的过程中,另一个线程想获取锁,那是不可能的,这就保证了锁资源的同步性,进而保证共享资源的同步性。刚才说了其他线程可能会进行等待,那锁资源空闲的时候就需要有一种方式去通知某个线程,去唤醒它们进行锁资源的竞争。互斥锁的作用主要就是确保任意时刻只有能有一个线程能够获得对资源的访问权,当某一个线程获得了锁资源,其他线程要进行等待,直到那个线程释放锁资源。

2023-07-19 15:51:43 356

原创 获取最小文件的大小

广度优先:优先计算出此目录下所有文件的大小,再进入到下一子目录。具体实现方式是维护一个队列,将文件初始路径插入,赋值给临时变量后将该路径弹出,并判断此路径是否是目录,是的话就优先将此目录下的所有文件计算大小,然后再继续走子目录。深度优先:只要目录下有子目录就一直递归到无子目录,然后分别计算该目录下的所有文件大小,最后回溯至上一目录继续此操作。

2023-07-18 16:22:17 121

原创 linux下编写一个函数,计算目录下总文件大小

在代码中,entryPath 是指向目录项的完整路径,通过调用 entryPath.c_str() 将其转换为 C 风格的字符串,以满足 stat 函数的参数要求。它接受一个指向已经打开的目录的指针 dirp,并返回指向 struct dirent 结构体的指针,该结构体包含了读取到的目录项的信息。其中,path 参数是要获取信息的文件路径,buf 参数是指向 struct stat 结构体的指针,用于存储获取的文件信息。当所有目录项都被读取完毕时,readdir 函数将返回空指针,表示已经到达目录末尾。

2023-07-18 10:36:09 508

原创 什么是原子性与可见性

原子性:原子性是指一个操作或一系列操作要么全部执行成功,要么全部不执行,中间不能被中断。换句话说,原子操作是不可分割的,要么完全执行,要么完全不执行,没有中间状态。原子性保证了多个线程或进程并发执行时数据的一致性。在并发编程中,原子性非常重要,特别是在共享资源的读写操作中。如果多个线程同时修改同一共享资源,并且这些修改不是原子性的,就可能导致数据不一致的问题。可见性:可见性是指一个操作对其他线程的影响在合理的时间内能够被其他线程观察到。

2023-07-17 09:43:09 515

原创 程序执行过程发生了什么

链接器会解析目标代码文件中的符号引用(如函数调用),并将其与相应的符号定义进行关联。最终,链接器将所有的代码和数据段组合在一起,生成可执行文件。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。总结起来,预处理、编译、汇编和链接是将高级语言源代码转换为可执行文件的关键步骤。它们在不同的阶段对源代码进行处理和转换,以便最终生成可以在计算机上运行的二进制代码。这一步产生的文件是 .o文件,是将汇编代码转换成机器码(二进制格式)的过程。此时产生的是 .i文件,这是一个文本文件。

2023-07-15 16:45:55 256

原创 介绍一下七层模型各自的作用

七层模型是计算机网络体系结构中的一种抽象概念,用于描述网络通信中各个层次的功能和协议。物理层:物理层是最底层的一层,主要负责在物理媒介上传输比特流。它定义了物理接口、电气特性、传输介质和物理拓扑等细节。物理层的主要功能包括数据的编码和解码、数据的传输速率、数据传输的时序以及物理连接的建立和维护。数据链路层(Data Link Layer):数据链路层位于物理层之上,主要负责将比特流划分为帧,并在直接相连的节点之间传输数据帧。

2023-07-15 10:27:57 481

原创 进程和线程的区别

线程和进程在资源占有和内核文件结构方面的区别:资源占有:进程:线程:总的来说,。

2023-07-14 09:22:01 193

原创 c++内存布局,和每个区存储的数据类型

需要注意的是,具体的内存布局和各个区域存储的数据类型可能会因操作系统、编译器、目标架构和编译选项的不同而有所差异。上述描述基于一般情况下的常见内存布局,可以作为一般的参考。实际的内存布局可能会有细微的差异,因此最好查阅相关文档或执行针对特定平台的实际测试来了解准确的内存布局和区域中存储的数据类型。存储的数据类型和变量的类型相关。初始化数据区(Initialized Data Segment):存储全局变量和静态变量的初始值。存储的数据类型和变量的类型相关。

2023-07-13 17:32:05 103

原创 如何使本文件中的类在外部文件不可见

要使本文件中的类在外部文件不可见,可以使用 C++ 的封装性原则和访问修饰符来限制类的可见性。这可以通过将类定义为私有(private)或者在源文件中不进行声明和定义来实现。这些方法确保了类的定义只在当前文件中可见,其他文件无法访问或引用该类。这样可以有效地限制类的可见性,提高程序的封装性。

2023-07-13 17:09:13 282

原创 一个线程如果处于持有锁的状态,而主线程需要它结束并返回,此时的主线程需要怎么做?

以下是针对主线程要求持有锁的线程退出的几种可能的解决方法的综合罗列:

2023-07-13 15:59:33 245

空空如也

空空如也

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

TA关注的人

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