- 博客(53)
- 收藏
- 关注
原创 (Linux) 高级IO
典型的五种IO模型:阻塞IO / 非阻塞IO / 信号驱动IO / 异步IO / 多路转接IOIO完成的过程:1、等待IO就绪(满足IO条件)2、进行数据拷贝阻塞IO:发起IO调用,若IO条件不具备,则一直等待。优点:流程非常简单,代码操作简单,任务顺序操作;缺点:无法充分利用资源,任务处理效率比较低。非阻塞IO:发起IO调用,若IO条件不具备,则立即报错返回,可以干点其他事情,完毕后循环回来重新发起IO请求。优点:相较于阻塞IO,任务处理效率高,利用IO等待时间干其他的事情;缺
2020-06-26 00:08:01
224
原创 (Linux)网络基础- - - 网络层(IP协议)、链路层
网络基础- - -网络层负责地址管理与路由选择(为每一条网络中的数据根据想去的地方选择合适的路径)IP协议格式4为版本号:IPV4 / IPV6;4位首部长度:标识IP报头有多长,以4字节为单位(最小20字节/最大60字节);8位服务类型:3位弃用 / 1位置0,4位TOS字段- - -最大吞吐量 / 最小成本 /最高可靠性 / 最小延时;16位数据报长度:限制了一个完整的IP报文最大长度不超过64k;udp报文数据最大长度不能超过64-20-8;分片标识:数据在实际传输时的最大长度不仅受
2020-06-16 21:02:21
513
原创 C++三大特性- - -多态(虚函数、重载、重写和重定义)
文章目录多态1. 多态的定义及实现1.1 多态构成条件1.2 虚函数1.3 虚函数的重写1.4 c++11中的 override 和 final1.5 重载、覆盖(重写)、隐藏(重定义)的区别2、抽象类2.1 纯虚函数2.2 接口继承和实现继承3、多态的原理3.1 虚函数表多态多态:通俗说就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。1. 多态的定义及实现1.1 多态构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了P
2020-06-06 17:28:53
1387
原创 C++三大特性- - -继承(菱形继承、继承和组合)
继承继承机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Student : public Person 中 Student 为派生类,public 为继承方式,Person 为基类。class Person{public: void Print() { cout <
2020-06-06 11:18:25
244
原创 (Linux网络协议)网络基础(应用层、传输层)
应用层直面程序员的一层,因为应用程序时程序员自己写的,因此应用层的协议都是程序员自己决定的。自定制协议程序员自己根据自己的应用特点,定义协议(数据的格式 / 数据的描述信息)序列化:将各个数据对象按照指定的协议组织成为持久化存储 / 数据传输的二进制数据串。(json序列化、protobuf、二进制序列化)。反序列化:将二进制数据串按照指定协议解析得到各个数据对象。一个序列化方式的好坏有很多的评定标准:解析性能、传输性能等。知名协议HTTP协议:超文本传输协议,早期专门用于传输超文本数据h
2020-05-30 10:49:30
456
原创 C/C++ 内存管理(malloc/calloc/realloc、free 和 new 、 delete区别;内存泄漏)
C/C++内存分布int globalVar = 1;static int staticGlobalVar = 1;//globalVar和staticGlobalVar是在main函数之前初始化,在哪都能用,作用域是全局的/*区别:它俩的链接属性不一样,globalVar是所有文件可见,staticGlobalVar只在当前文件可见*/void Test(){ static int staticVar = 1; //运行到这里才初始化,它的作用域在Test函数中,只能在Test函数中使用
2020-05-27 11:19:32
453
原创 C++类和对象(static成员、友元、内部类、C++11 的成员初始化)
static成员声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。静态成员为所有类对象所共享,不属于某个具体的实例;静态成员变量必须在类外定义,定义时不添加static关键字;类静态成员即可用类名::静态成员或者对象.静态成员来访问;静态成员函数没有隐藏的this指针,不能访问任何非静态成员;静态成员和类的普通成员一样,也有public、protected、pri
2020-05-19 21:52:38
278
原创 网络编程(网络基础、套接字编程、udp/tcp客户端与服务端)
网络基础1网络的划分局域网(覆盖范围在1000m内)城域网(覆盖范围在20㎞内)广域网(覆盖范围大于20km),(互联网 / 因特网是更大的国际性的广域网- - - 容灾性更强,以太网 / 令牌环网 是组网方式)IP地址uint32_t - - - 无符号4个字节的整数1、在网络中作为主机的唯一标识,网络中主机之间的定位(哪个主机与哪个主机之间进行通信),通过IP地址进行标识。2、网络中每条数据中都会包含:源端的IP地址 / 对端的IP地址;3、ipv4 : uint32_t - -
2020-05-15 16:10:30
375
原创 C++(入门基础)缺省参数、函数重载、引用、内联函数
命名空间命名空间定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。//1. 普通的命名空间namespace N1 // N1为命名空间的名称{ // 命名空间中的内容,既可以定义变量,也可以定义函数 int a; int Add(...
2020-05-03 00:30:28
272
原创 进程信号(信号产生、注册、注销、处理),信号阻塞和volatile关键字
进程信号信号:信号是一个软件中断;作用:操作系统通过信号告诉进程发生了某个事件,打断进程当前操作,去处理这个事情操作系统中的信号:通过 kill -l 命令可以查看系统中的信号种类(62种)1~31好信号:从Uinux借而来,每个信号都有具体对应的系统事件;(非可靠信号,有可能丢失信号);34~64号信号:后期补充的,因为没有具体对应的事件,因此命名比较草率;(可靠信号,不会丢失信号)...
2020-04-10 23:22:30
634
2
原创 进程间通信(Linux面试干货)
进程间通信(IPC)为什么操作系统要为用户提供进程间通信方式?答:因为进程的独立性。每个进程都有自己的独立虚拟地址空间,操作的都是自己的地址,所以进程之间无法直接进行通信。进程间通信方式从Unix借鉴的:管道- - -资源传输;systemV标准的进程间通信方式:共享共存、消息队列、信号量管道:传输资源- - -传输的是数据资源;本质:内核中的一块缓冲区,若多个进程可以访问...
2020-04-03 21:26:44
517
原创 基础IO(文件系统、软链接文件和硬链接文件、静态库和动态库的打包和使用)
** 用户态缓冲区**:我们通常所说的缓冲区是文件流指针结构体中定义的缓冲区。 文件系统:Linux下的ext2文件系统为例,文件系统就是磁盘上管理文件的系统 存储一个文件需要找到空闲的磁盘块存储文件数据,以及需要找到一个未被使用的inode节点存储自己的源信息,针对每一个磁盘块做一个整体的位图,就可以快速找到空闲的磁盘块。 文件的权限就是使用位图存储,一个用户有没有权限也就是...
2020-04-02 00:31:19
206
原创 QT基础(入门)
对QT文件中的.pro文件解释QT += core gui //QT包含的模块QT中的快捷键-注释:ctr+/ 运行:ctrl+r编译:ctrl+b查找:ctrl+f整行移动:ctrl+shift+向上键/向下键帮助文档:F1自动对齐:ctrl+i同名之间的.h和.cpp的切换:F4...
2020-03-29 00:35:31
161
原创 基础IO(文件输入输出、标准IO接口、文件描述符和文件流指针)
基础IO(文件的输入输出操作)例:fopen/fwrite/fread/fseek/fclose stdin/stdout/stderrFILE *fopen(char* filename,char* mode);(文件名称,打开方式)打开方式:*r(只读); r+(读写);w(只写);w+(读写);a(追加写);a+(追加读写);b(二进制操作)。追加写:每次写入...
2020-03-24 14:10:13
676
原创 C语言中常见的排序方法(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序)
插入排序void PrintArray(int* a, int n){ for (size_t i = 0; i < n; ++i) { printf("%d ", a[i]); } printf("\n"); }void InsertSort(int* a, int n){ // 控制end的位置从0走到n-2 for (int i = 0; i < n...
2020-03-22 00:30:59
318
原创 进程(三)----(进程创建、进程终止、进程等待、进程替换)字符串解析,实现一个minishell
进程控制1、进程创建pid_t fork(void);- - - - -创建一个进程(父子进程数据独有,代码共享)写时拷贝技术(提高进程创建效率):子进程复制了父进程,一开始与父进程指向同一块物理内存;因此看起来父子进程完全相同;但是进程之间具有独立性,意味着当这块物理内存中数据即将发生改变时会重新给子进程开辟物理内存,将数据拷贝过来,因为子进程应该有自己的数据。按理说每个进程都应该有自己...
2020-03-17 01:02:06
228
原创 进程(二)----环境变量、虚拟地址访问物理空间、内存管理方式
进程优先级:一个进程对与CPU资源获取的优先权为什么要有优先级?(让操作系统运行的更加良好)交互式进程:直接与用户进行交互的进程,(要求最好能够更加有限的被CPU处理)。批处理进程:在后台默默做循环工作的进程。环境变量:配置系统运行环境参数的变量。环境变量优点使系统运行环境配置更加简单灵活,可以通过设置环境变量给一个进程传递参数信息。环境变量的操作查看环境变量:env/set(查看所...
2020-03-13 16:01:00
443
原创 翻转单词(字符串)
翻转单词翻转单词有两种常见的方式:1、借助一个临时字符数组;思路:(1)、借助一个临时字符数组将元字符数组的内容按相反的顺序存储在临时字符中; (2)、将临时数组的内容顺序复制回原数组中。代码:#include<stdio.h>#include<stdlib.h>#define MAX_STRING 7 //数组容量,宏定义int main(){...
2020-03-13 00:59:44
2047
原创 打印出输入字符串的有效长度,不借助strlen函数实现
打印出输入字符串的有效长度,不借助strlen函数实现通常对字符串有效长度的统计,我们会采用strlen()函数,它的头文件为string.h#include<stdio.h>#include<string.h>#define SIZE 20int main(){ char str[SIZE] = "word ok"; //定义str,并赋值 int l...
2020-03-12 12:50:16
691
原创 力扣(二叉树、C语言)单值二叉树、二叉树的深度、对称二叉树
1、单值二叉树力扣965题:单值二叉树题目:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。分析:1、判断树的根节点是否为空,为空则为单值二叉树,返回true;2、此时树不为空,分别判断根节点左孩子节点和右孩子节点值是否不等于根节点,不等于则返回false;3、此时左右孩子节点和根节点的值一致,分别再将左右孩...
2020-03-11 14:12:11
190
原创 力扣572题,另一个树的子树;力扣100题,相同的树。(C语言)
1、另一树的子树:力扣572题:另一树的子树题目:给定两个非空二叉树 s 和 t,检验s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例: 分析:一个树为另一个树的子树,1、判断两个数是否为空树,均为空树则返回真;2、如果主树为空,而子树不为空,则返回false;3、判断...
2020-03-11 13:23:37
228
原创 求两个矩阵的和,然后求出矩阵对角线上元素之和(C语言)
两个矩阵求和:首先两个矩阵的行数和列数应一致,然后将相同位置上的两个数相加保存到其中一个数组中,再输出。矩阵对角线上的元素之和:对角线上元素的行号和列号的具有的特征:1、行号等于列号;2、行号与列号之和为总行数。即:if (i != SIZE - 1 - i) sum += array1[i][i] + array1[i][SIZE - 1 - i]; else sum +=...
2020-03-08 23:53:08
4479
原创 C语言练习(输出图形 输出矩阵元素之和)
题1.打印图形。按输入的边长,打印一个正方形。其偶数行(从0行开始计算)填充=,奇数填充+,例如输入为1,则打印: =如果输入5,则打印:#include<stdio.h>#include<stdlib.h>void main(void){ int i, j; int length; printf("please input length(>0)...
2020-03-04 16:50:08
1098
原创 (C++入门)通讯录管理系统
一、显示联系人1、添加完联系人后为了让目录不用一直刷屏显示,只需要将上次的结果显示后清屏即可;system(“cls”);//清屏操作为了使得显示界面不占这么多行,采用 “\t” 代替 endl;为了将男女显示出来,而不是显示 1 和 0,可以用 三目运算符;直接上详细代码块:#include<iostream>#include<...
2020-02-23 23:42:53
156
原创 (C++)按照英雄年龄从小到大进行排序(结构体、冒泡排序)
按照英雄的年龄从小到大进行排序(冒泡排序、结构体)#include<iostream>using namespace std;#include<string>struct Hero{ string name; int age; string sex;};//1.设计英雄结构体struct Hero heroArray[5] = { { "刘备",...
2020-02-12 22:14:23
2210
原创 进程(一)---- 操作系统、进程创建
进程概念:冯诺依曼体系结构认识操作系统进程概念进程状态环境变量程序地址空间进度调度冯诺依曼体系结构现代计算机硬件体系结构输入设备:采集获取数据 键盘输出设备:数据输出 显示器存储器:内存运算器:中央处理器cpu控制器:硬件结构决定软件行为:QQ聊天所有的硬件都是围绕着内存工作的认识操作系统操作系统:系统内核+外部应用功能:管理计...
2020-01-13 19:05:57
1126
原创 Linux基础指令和常用工具
Linux初始阶段 4Linux的发展史与基础指令Linux下的常用工具Linux系统环境下编程阶段 14进程概念 2进程控制 1.5基础IO 2进程间通信1.5进程信号 1.5多线程 5Linux网络编程阶段 10网络基础1 1网络编程 2网络基础2 4.5网络基础3高级IO 2.51、windows下的软件:在VMware...
2020-01-13 16:57:34
197
原创 牛客网数据结构,链表的回文结构(C语言)
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL...
2020-01-03 00:11:48
225
原创 牛客网,链表分割(C语言)
链接https://www.nowcoder.com/questionTerminal/0e27e0b064de4eacac178676ef9c9d70来源:牛客网编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。代码:/*s...
2020-01-03 00:07:35
306
原创 牛客(C语言) 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/typedef struct ListNode Node;class Solution {public: ListNode*...
2020-01-03 00:03:43
578
原创 力扣160题(C语言),相交链表
编写一个程序,找到两个单链表相交的起始节点。注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists...
2020-01-02 23:58:37
388
原创 力扣21题(C语言)合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */typedef struct ListNode Node;...
2020-01-02 23:52:49
306
原创 力扣206题(C语言)反转链表
反转一个单链表代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */typedef struct ListNode Node;struct ListNode* reverseList(struct L...
2020-01-02 23:48:40
278
原创 力扣189题(C语言)旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。代码:void reverse(int* nums, int begin, int end){ while (begin < end) { int tmp = nums[begin]; nums[begin] = nums[end]; nums[end] = tmp; ++begin; -...
2020-01-02 23:43:52
196
原创 Linux 常用命令(常用必备)
Linux常用命令ls 列出当前目录有哪些文件ls //表示根目录cd(change dir) 切换当前目录ls -l (ll)更详细罗列当前文件目录的详细细节pwd 查看当前目录是什么touch创建文件cat 查看文件内容echo写入文件内容 如:echorm 删除文件,删除目录(rm -r 目录名) 、 rm -rf是一个常用操作,能够直接删除目...
2019-12-18 23:58:06
94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人