自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 QString - 查找字符串数据 + 转化

QByteArray类具有一个字节它既可以存储原始字节 (raw bytes),也可以存储传统的以“0”结尾的 8 位的字符串。在Qt中,使用QByteArray 比使用const char*更方便,且QByteArray 也支持隐式共享。QString提供的字符编码集的转换函数将会返回一个const char*类型版本的 QByteArray 即构造函数QByteArray(const char*)构造的QByteArray对象。QString - 查找字符串数据。

2023-09-20 15:30:23 504

原创 QString - 操作字符串

QString::simplified() --- 移除字符串两端的空白字符,使用单个空格字符 “ ”代替字符串中出现的空白。QString::trimmed() --- 移除字符串两端的空白字符。2、QString::append() --- 字符串的末尾追加。类型相对安全,完全支持Unicode,并且允许“%n”参数的顺序。QString::arg() -- 字符串组合。

2023-09-20 14:00:56 120

原创 C++ 数据类型

大部分情况下,这三种方式(花括号表示法、函数表示法和赋值表示法)是等效的。但当发生缩窄转换(namowing conversion)时,初始化列表形式要稍微安全一些。缩窄转换会把值转换为一种取值范围更窄的类型,因此这种 转换可能丢失信息。采用初始化列表的方式是C++11引入的新的语法 提高了安全性。这两种方式都是初始化0。

2023-08-26 17:19:56 97

原创 LinuxC 线程 -- 条件变量

多线程配合工作时,当线程检测到某条件不满足时就休眠,直到别的线程将条件准备好,然后通过条件变量将其唤醒。主线程对va变量循环+1,次线程发现va==5时,打印va的值并将va清0,如果va的值!1、定义一个条件变量(全局变量)由于条件变量需要互斥锁的配合,所以还需要定义一个线程互斥锁。条件变量需要在互斥锁的配合下才能工作。4、删除条件变量,也需要把互斥锁删除。

2023-08-06 10:23:25 154

原创 LinuxC 线程 -- 信号量

有四个进程1、2、3、4。线程1的功能就是输出A,线程2的功能就是输出B,以此类推.........现在有四个文件ABCD。

2023-08-05 22:22:50 80

原创 LinuxC 进程间通信 --- 信号量

有四个进程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。信号量其实是OS创建的一个共享变量,进程在进行操作之前,会先检查这个变量的值,这变量的值就是一个标记,通过这个标记就可以知道可不可以操作,以实现互斥。1、进程调用semget函数创建新的信号量集合,或者获取已有的信号量集合。3、调用semop函数,对集合中的信号量进行pv操作(加锁解锁)有多少个进程需要同步,我们在集合中就需要创建对应数量的信号量。4、调用semctl删除信号量集合。

2023-08-05 17:01:53 143

原创 LinuxC 进程间通信 --- 共享内存

让同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新;2、直接使用地址来读写缓存时,效率会更高,适用于大数据量的通信。2、进程调用shmat函数,将物理内存映射到自己的进程空间。1、进程调用shmget函数创建新的或获取已有共享内存。4、调用shmctl函数释放开辟的那片物理内存空间。3、shmdt函数,取消映射。1、减少进入内核空间的次数。

2023-08-05 15:27:41 136

原创 LinuxC 进程间通信 --- 消息队列

消息队列的本质就是由内核创建的用于存放消息的链表,由于是存放消息的,所以我们就把这个链表称为消息队列。2、多进程网状交叉通信时,消息队列是上上之选。3、能实现大规模数据的通信。1、传送有格式的消息流。

2023-08-05 10:42:17 329 1

原创 LinuxC 进程间通信 --- 管道

这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。1、写管道时,如果管道的读端被close了话,向管道“写”数据的进程会被内核发送一个SIGPIPE信号, 发这个信号的目的就是想通知你,管道所有的“读”都被关闭了。1、为了保证管道一定被创建,最好是两个进程都包含创建管道的代码,谁先运行就谁先创建,后运行的发现管道已经创建好了,那就直接open打开使用。

2023-08-04 20:31:35 55

原创 LinuxC 进程间通信 --- 信号

2、设置SIGIO信号由哪个进程接收。信号 -- 实现异步IO操作。1、设置信号的处理函数。3、设置可以异步读取。

2023-08-04 17:28:51 38

原创 LinuxC 进程

用两个进程实现一个读鼠标一个读键盘demo。

2023-08-04 15:38:22 34

原创 LinuxC 网络 -- TCP(C/S)IO多路转接(epoll)demo

epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。epoll维护的树在共享内存中,内核区和用户区去操作共享内存,因此不需要区域转换,也不需要拷贝操作。1、ET模式(边缘触发)只有数据到来才触发,不管缓存区中是否还有数据,缓冲区剩余未读尽的数据不会导致epoll_wait返回;2、边缘触发需要一次性的把缓冲区的数据读完为止,也就是一直读,直到读到EGAIN(EGAIN说明缓冲区已经空了)为止。3、边缘触发需要设置文件句柄为非阻塞。

2023-08-03 14:29:00 76

原创 LinuxC 网络 -- TCP(C/S)IO多路转接(poll)demo

【代码】LinuxC 网络 -- TCP(C/S)IO多路转接(poll)demo。

2023-08-03 11:18:19 61

原创 LinuxC 网络 -- TCP(C/S)IO多路转接(select)demo

【代码】LinuxC 网络 -- TCP(C/S)IO多路转接(select)demo。

2023-08-03 11:08:50 60

原创 LinuxC 网络 -- TCP(C/S)多线程服务器demo

阻塞式IO + 多线程:每来一个客户端创建一个线程。

2023-08-03 10:59:16 78

原创 线程池(C \ C++)--- 可伸缩式线程池

线程池会根据当前的线程数量和任务队列的情况,决定是将任务分配给已有的线程还是创建新的线程来处理任务。总之,可伸缩线程池的实现原理主要包括线程池的创建和初始化、任务的提交和处理、线程的管理和调度、动态调整线程数量以及错误处理和资源回收等方面,通过合理地管理线程和任务,以提高系统的并发性能和资源利用率。线程的管理和调度:线程池需要维护一个线程池管理结构,用于记录线程的状态和相关信息。线程池的创建和初始化:在创建线程池时,需要指定线程池的初始大小和最大大小。上述来源于chatGBT。

2023-08-03 10:29:52 135

原创 LinuxC 网络 -- TCP(C/S)多进程服务器demo

阻塞式IO + 多进程:每来一个客户端创建一个进程。

2023-07-31 21:13:24 99

原创 LinuxC 网络 -- TCP(C/S)循环服务器demo

【代码】LinuxC 网络 -- TCP(C/S)循环服务器demo。

2023-07-31 20:46:28 63

原创 LinuxC 网络 -- TCP(C/S)demo

同一时间只能响应一个客户端的请求,将小写字母转换成大写字母。在中间客户端发送数据时候会发生阻塞,无法响应其他客户端。中间客户端下线之后,右端收到消息。

2023-07-31 20:30:19 119

原创 08、LinuxC -- IO多路复用 poll函数

这个数组就相当于select的文件描述符集合,只不过select是使用fd_set来定义的,而poll的集合是一个数组。如果文件描述符“发生的事件”==“实际事件”,就说明希望的事件来了,就是对fd进行相应的“读或写”操作。监听集合没无动静,如果没有动静就阻塞,如果有动静就成功返回,返回值为集合中有动静的fd的数量。因为无法获取具体哪个文件描述符发生变化,只能进行全盘轮询,随着监听的文件描述符增多,效率下降;poll 监听时如果没有动静就阻塞,有动静就不再阻塞,返回有动静的fd的数量。

2023-07-31 16:36:19 102

原创 07、LinuxC -- IO多路复用 select函数

2、因为无法获取具体哪个文件描述符发生变化,只能进行全盘轮询,随着监听的文件描述符增多,效率下降;3、所监听的文件描述符都必须从用户空间传入内核空间进行监听,涉及到大量的数据拷贝,效率低;1、采用数组的方式保存监听的文件描述符,由于数组的空间分配方式(静态分配),个数受限;在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件fd发生了变化。宏FD_ SET将文件描述符fd添加到文件描述符集fdset中;maxfd:文件描述符的范围,比待检的最大文件描述符大1。

2023-07-31 16:06:25 74 1

原创 06、LinuxC -- 系统调用 fcntl函数

4.获得/设置异步 I/O 所有权(cmd=F_GETOWN 或 F_SETOWN).5.获得/设置记录锁(cmd=F_GETLK,F_SETLK 或 F_SETLKW)第三步:写:将改后的标志位设置回去 fcntl(0,F_SETFL,flags);第一步:读,获取之前的标志位:flags = fcntl(0,F_GETFL);2.获得/设置文件描述符标记(cmd=F_GETFD 或 F_SETFD).3.获得/设置文件状态标记(cmd=F_GETFL 或 F_SETFL).fd:目标文件描述符。

2023-07-31 11:13:59 100 1

原创 05、LinuxC -- 系统调用 mmap函数 存储映射

内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;调用成功,返回映射的起始虚拟地址,失败则返回(void*)NULL,errno被设置。

2023-07-31 10:29:47 167 1

原创 04、LinuxC -- 系统调用 wirte,read,lseek函数

通过系统调用 读一行写一行 实现文件拷贝 demo

2023-07-30 21:08:19 231 1

原创 数据结构(C语言)-- 线索二叉树

有 2n 个指针,2n - (n - 1) = n + 1 个指针没有用。* 利用这个n + 1个指针,来指向我们二叉树遍历序列当中的前驱和后继。先序线索二叉树:是指如果节点没有左右孩子,则指针指向先序遍历的前驱和后继。* 线性结构有前驱有后继。我们使用线索将二叉树转换成类似的线性结构。* 如果一个二叉树有 n 个节点,那么有多少个指针指向这些节点?线索其实就是将节点连在一起的指针;* 有 n-1 个指针指向他们。* 一共有多少个指针?* 左 --> 前驱。* 右 --> 后继。

2023-07-30 20:38:25 345 1

原创 03、LinuxC -- 系统调用 close函数

若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。1、EBADF 表示参数 fd 非已打开的文件的文件描述符。close( )用来关闭open( )打开的文件。

2023-07-30 16:28:10 484 1

原创 02、LinuxC -- 系统调用 open函数

文件若不存在则建立该文件,否则将导致打开文件错误。4、O_TRUNC:若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。3、S_IWUSR:或S_IWRITE,00200权限,代表该文件所有者具有可写入的权限。2、S_IRUSR:或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。4、S_IXUSR或S_IEXEC:00100权限,代表该文件所有者具有可执行的权限。1、S_IRWXU:00700权限,代表该文件所有者具有可读、可写及可执行的权限。

2023-07-30 16:17:34 290 1

原创 01、LinuxC -- 系统调用 creat函数

creat( ) 会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno。2、EACCESS 参数pathname所指定文件不符合所要求测试的权限。4、EFAULT 参数pathname指针超出可存取的内存空间。3、EROFS 欲打开写入权限的文件存在于只读文件系统内。1、EEXIST 参数pathname所指的文件已存在。9、ELOOP 参数pathname有过多符号连接问题。10、EMFILE 已达到进程可同时打开的文件数上限。5、EINVAL 参数mode不正确。

2023-07-30 15:25:30 194 1

原创 数据结构(C语言)-- 二叉树 非递归遍历 前序 + 中序 + 后续 demo

【代码】数据结构(C语言)-- 二叉树 非递归遍历 前序 + 中序 + 后续 demo。

2023-07-30 11:25:56 81 1

原创 数据结构(C语言)-- 二叉树 + 层次遍历demo

二叉树的层次遍历

2023-07-29 22:19:34 36

原创 数据结构(C语言)-- 二叉树创建 + 遍历demo

二叉树创建 + 遍历

2023-07-29 21:27:38 30

原创 算法(C语言)-- KMP 算法

KMP算法是一种高效的模式匹配算法,它牺牲了一定的空间保存 next 数组,提高了匹配效率。KMP算法的核心:减少主串指针的移动,并且快速找到前后匹配的状态,从而加快我们匹配的进程。* 当该字符与主串发生不匹配之后,值对应索引的字符要移动到跟主串不匹配字符对齐。* 暴力在刚在的匹配的过程中,主串指针回溯了多次,才达到了匹配的状态。* KMP算法可以更加智能的移动字符串,让字符串达到匹配状态。* KMP算法,主串没有回溯,并且快速达到匹配状态。* 找公共前后缀的目的是:为了找到前后能够匹配的状态。

2023-07-29 16:20:53 67

原创 算法(C语言) -- 字符串暴力匹配

【代码】算法(C语言) -- 字符串暴力匹配。

2023-07-29 10:58:32 139

原创 数据结构(C语言) -- 循环队列demo

【代码】数据结构(C语言) -- 循环队列demo。

2023-07-29 09:53:43 36

原创 数据结构(C语言) -- 队列demo

只能在一段进行操作,会存取元素有先进后出的特点。

2023-07-28 22:08:07 48 1

原创 数据结构(C语言) -- 栈demo

【代码】数据结构 -- 栈demo。

2023-07-28 21:11:50 23 1

原创 数据结构(C语言) -- 双循环链表demo

有头节点的双向循环链表。

2023-07-28 20:01:15 56 1

原创 数据结构(C语言) -- 双链表demo

【代码】数据结构(C语言) -- 双链表demo。

2023-07-28 17:30:02 48 1

原创 数据结构(C语言) -- 单循环链表demo

有头节点的单循环链表

2023-07-28 16:16:04 42 1

原创 数据结构(C语言) -- 单链表demo

头节点的单链表

2023-07-28 15:34:24 52 1

空空如也

空空如也

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

TA关注的人

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