- 博客(20)
- 收藏
- 关注
原创 epoll多路复用
目录 1. epoll的接口使用 1.1 创建 1.2 监听队列 1.3 就绪队列 2. epoll的底层实现 3. epoll VS select 3.1 select的缺点 3.2 epoll的优点 4. epoll对文件描述符操作的两种模式 4.1 概念 4.2 为什么ET模式又称为高效模式? 4.3 ET模式下需要注意什么? 4.4 两种实现方式 1. epoll的接口使用 1.1 创建 //创建 int epoll_create(int size); //size
2021-12-01 19:05:59
528
原创 OOP特性之多态
1. 什么是多态? 对于同一种指令,针对不同的对象产生不同的行为 分为静态多态和动态多态:静态多态发生在编译时 --- 函数重载、运算符重载、模板;动态多态发生在运行时 --- 虚函数 2. 虚函数 2.1 虚函数的定义 成员函数名前 + virtual关键字 在派生类中重写虚函数:函数名、参数个数、类型、顺序、返回类型必须和基类中一致 2.2 虚函数的实现: 基类定义虚函数时,会在基类存储布局顶部生成一个虚函数指针指向虚函数表。派生类继承虚函数时同样...
2021-11-15 14:10:26
932
原创 类---继承
1. 基类和派生类 c++中的继承:从既有类(基类)产生新类(派生类) 1.1 派生类的生成步骤 吸收基类的成员 改造基类的成员 新增自己的成员 1.2 派生类的局限 数据成员可以完全吸收,但成员函数不能 不能被继承:构造、析构函数、基类重载的operator=/new/delete函数、友元关系 1.3 派生方式 派生方式 基类中访问权限 派生类访问权限 派生类对象访问权限 public public public 可以直接访问 protecte
2021-11-14 20:51:01
605
原创 特殊的成员
1. 特殊的数据成员 1.1 常量数据成员 只能在构造函数初始化列表中进行初始化,不可赋值 --- 可视为普通常量。 1.2引用数据成员 只能在构造函数初始化列表中进行初始化,占用一个指针大小的空间(用于区分)。 1.3类成员对象 一个类创建的对象作为另一个类的数据成员(子对象)。 此时会调用子对象的默认构造函数。 必须在另一类的初始化列表中显式初始化子对象。 1.4静态数据成员 存储在全局静态区,不占用对象的大小,被所有对象共享。 不能在初...
2021-11-06 09:26:51
131
原创 类对象的创建和销毁
析构函数 1. 特征 ① 函数名 = ~ + 类名;② 无参,无返回类型,故不可重载,函数唯一。 2. 被调用时机 无论何时一个对象被销毁,就会自动调用其析构函数。 变量在离开其作用域时被销毁。 当一个对象被销毁时,其成员被销毁。 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁。 对于动态分配的对象,当对指向他的指针应用delete时被销毁。 对于临时对象,当创建它的完整表达式结束时被销毁。 3. 注意 由于析构函数自动运行,程序可以按需分配资源而无需担心何时释...
2021-11-03 23:36:15
1558
原创 const关键字
1. const修饰一般变量 const关键字修饰的变量成为常量。常量需要初始化,且不可赋值。 宏定义和const常量的区别 宏定义发生在预处理阶段,只进行简单的字符串替换,不占用内存空间,不进行检查,发生错误时在编译阶段才会发现。 const常量发生在编译阶段,常量具有数据类型,占用内存空间,便于编译器进行检查。 2. const修饰指针 常量指针(pointer to const) const int *p; //const 修饰 *p *p = v...
2021-11-01 20:55:45
145
原创 Mysql数据库的备份与恢复
1. 数据库的备份 musqldump -u root -p 需要备份的数据库 > 备份的结果 2. 数据传输 sudo apt install lrzsz sz:从linux发送数据到windows rz:sz的反操作 3. 数据库的恢复: ① 先创建需要恢复的数据库库名 ② sudo mysql -u root -p 需要恢复的数据库 < 恢复文件 4. 常用命令 # 登录Mysql $ mysql -u root -p; #查看MySQL的状态 $ s.
2021-10-16 16:18:21
135
原创 数据库编程基本流程(query)
函数查询地址 MySQL :: MySQL 8.0 C API Developer Guide :: 5.4 C API Basic Function Descriptionshttps://dev.mysql.com/doc/c-api/8.0/en/c-api-function-descriptions.html 1. 初始化数据库 SQL* mysql_init(MYSQL *mysql); // An initialized MYSQL* handler. // NULL i.
2021-10-16 16:05:59
550
原创 SQL数据库
目录 1. 数据库相关概念 1.1 什么是数据库 1.2 分类 1.3 数据库服务器、数据库和标的关系 1.4 基本操作 2. SQL语言 2.1 DDL 2.2 DML 2.3 DQL 3. 数据完整性 3.1 分类 3.2 表的约束 4. 多表设计 4.1 多个表的关系 4.2 对表的操作 4.3 DQL 4.1 连接查询 4.2 联合查询 4.3 报表查询 1. 数据库相关概念 1.1 什么是数据库 ① 数据库是一个实体,是能合理保管数据的“...
2021-10-15 23:00:57
532
原创 Linux线程基础
1. 线程的基本概念 1.1 进程和线程 进 程 线 程 资源分配的基本单位 CPU调度的基本单位 有独立的数据段、代码段和栈空间等独立资源 几乎没有独立资源,只有少量栈空间 上下文切换时间长 上下文切换时间短 进程控制表TLB 线程控制表TCB 一个进程至少拥有一个main线程,可以拥有多个线程,多个线程共享进程的资源和地址空间。 线程执行开销小,占用CPU少,切换快,但不利于资源的管理和保护。 进程则相反。 1.2..
2021-10-01 16:12:49
399
原创 软中断1 --- 信号
1. 信号的特点 信号是消息的载体 信号是一种软中断 2. 信号的默认行为 term --- 终止一个进程 ign --- 忽略 core --- 终止进程,产生core文件 stop --- 停止一个进程 con --- 继续运行 3. 信号的处理 默认处理:以默认方式处理。 忽略:进程继续运行,忽略对信号的处理。 捕捉信号并处理:进程实现定义信号处理函数,接收到信号时由函数自动捕捉并处理。 4. signal //信号处理函数 typedef void (*sighan
2021-09-29 23:38:30
463
原创 System V IPC --- 消息队列
目录 1. 消息队列的特点 2. 创建消息队列 3. 向消息队列发送数据 4. 从消息队列取出数据 5. 两种特殊情况 1. 消息队列的特点 消息队列是一种进程间通信的手段,只适用于在本地的多进程进行通信。 消息队列维持一个消息的链表,使用先进先出的方式 消息队列是有边界的,并不是一次性读取全部数据 2. 创建消息队列 int msgget(key_t key, int msgflg); 3. 向消息队列发送数据 int msgsnd(int msqid, const void
2021-09-29 20:04:23
222
原创 Sysytem V IPC --- 信号量
1. 信号量 1.1 基本概念 ① 原子操作 --- 不可被分割的操作 ② 信号量 --- os为了实现进程同步而引入的一种机制,由荷兰科学家Dijstra提出 ③ 信号量的值 --- 当前可用资源的数量 ④ 信号量分类:SYSTEM V 、POSIX、POSIX基于内存 ⑤ 二进制信号量 --- 只有两种值的信号量,也叫二元信号量,能够实现互斥 ⑥ 计数信号量 --- 信号值大于1 ⑦ 实现信号量对资源的控制操作 --- PV操作 ...
2021-09-28 16:51:21
158
原创 System V IPC --- 共享内存
目录 1. 共享内存特性 2.创建 3. 使用 4. 操作 5. 私有共享内存 共享内存 --- 一块可以被多个进程共享的内存空间 1. 共享内存特性 ① 共享内存一旦创建成功就会一直存在,不会随着进程的结束而消失,直到主动删除或系统重启; 2.创建 ①shmget定义 int shmget(key_t key, size_t size, int shmflg); //成功则返回共享内存的标识符 //key -- 生成共享内存需要的键值 //size -- 共享内存大小 //s..
2021-09-27 21:49:31
313
原创 进程间通信---管道
1. 无名管道 1.1 创建 int pipe(int fildes[2]); 1.2 特性 ① 有固定的数据流向 --- fd[1] 写端,fd[0] 读端,通信方式为半双工; ② 只能在有亲缘关系的进程之间进行通信; ③ 无名管道是内核维护的缓冲区,生存周期有限; ④ 基于字节流通信,数据没有边界,可以多次写入,一次全部读取; ⑤ 管道的写端关闭,read时不会阻塞,返回值为0; ⑥ 管道的读端关闭,write时写管道会受到系统发送的13号信号SIGPIPE终止进程 2. 无名管
2021-09-27 14:21:32
330
原创 静态库和动态库
1. 库文件 将一些函数代码写好,编译成二进制指令。 专门提供给其他文件使用 2.静态库VS动态库 2.1 静态库 直接打包进产品。 如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中。 2.2 动态库(共享库) 产品使用过程中动态加载。 在程序编译时并不会被链接到目标代码中,只是把库文件的路径告知可执行程序,在程序运行时才被载入。 2.3 静态库和动态库的区别 大小 安装难度 更新难度 动态库 小
2021-09-19 19:53:43
119
原创 红黑树总结
目录 1. 红黑树的基本特征 2. 红黑树的插入 3. 红黑树的删除 1. 红黑树的基本特征 ① 结点必须是红色或黑色; ② 根节点必须为黑; ③ 空叶子为黑; ④ 红色结点的孩子必然是黑(即从根结点出发到空叶子的任意路径上不存在连续的红色结点); ⑤ 从根出发到所有空叶子的所有简单路径上黑色结点数必须相等。 2. 红黑树的插入 情况一:插入位置为根结点---直接插入; 情况二:插入位置不是根结点,且双亲节点为黑---直接插入; 情况三:插入位置不是根结点,且双亲结点为红,叔叔结点为红-
2021-09-12 20:35:49
149
原创 两个查找算法
1.二分查找(折半查找) T(n) = O(nlogn) void binarySearch(int arr[], int left, int right, int searchNum) { int mid; while (left <= right) { mid = (left + right) / 2; if (arr[mid]== searchNum) { printf("%d is in the array.\n", searchNum); return; }
2021-09-12 20:16:41
127
原创 八个排序算法
目录 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.堆排序 7.归并排序 8.计数排序 1.冒泡排序 思路:从N,N-1,···,2个数中找到最大值,放在当前数组的末尾。 优化版:当一趟比较中没有发生任何交换时,说明数组已经有序。 void bubbleSort(int arr[]) { int cnt = 0; for (int i = N; i > 0; --i) { for (int j = 0; j < i -
2021-09-12 19:39:09
493
原创 二叉树的基本操作
目录 1.层次建立二叉树 1.1 结点已知 1.2 结点未知 2.先序遍历 3.中序遍历 4.后序遍历 1.层次建立二叉树 1.1 结点已知 借助一个索引数组。 ① 申请空间; ② 双指针法:i指向要修改指针域的结点;j指向要被放入的结点。 void buildTree(pTreeNode_t arr[], char c[]) { for (int i = 0; i < N; ++i) { arr[i] = (pTreeNode_t)calloc(1, size
2021-09-12 13:58:25
156
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅