自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 资源 (10)
  • 收藏
  • 关注

原创 Cache与主存之间的映射

概述了Cache是什么,Cache引入的出发点;介绍了Cache和主存之间关系,以及Cache怎样和主存进行映射,CPU怎样通过主存地址从Cache中拿到想要的数据。最后给出了Cache容量的计算方式。

2022-10-13 13:23:43 472 1

原创 armv8源码添加Qt串口模块

详述怎样在arm平台下为Qt单独添加串口模块

2022-09-15 22:17:29 688

原创 重载全局和成员new/delete

1. 重写全局new/delete重载::operator new、::operator delete、::operator new[]、operator delete[]注意:如果重载的是全局的,所以创建对象时编译器调用operator new、operator delete时都会去调用自己重载的版本;如果重载的类成员operator new,那么只在创建和释放该类对象时编译器调用自己重载的operator new、operator delete版本。如果Fraction类没有重写本来的new/de

2022-05-27 17:54:51 425

原创 C++面向对象之类与类关系

1. 复合:has-a关系queue(队列)容器:是一种先进先出的数据结构。队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为deque(双端数组)容器:可以在头尾两端进行插入和删除操作。擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。可以根据需要修改自身的容量和大小。容器中存储元素并不能保证所有元素都存储到连续的内存空间中。queue与deque就是一种has-a关系,queue中包含了

2022-05-22 14:20:15 332

原创 详析new/delete内存分配与释放的内部工作流程

本文借用C++标准库中Complex类和string类中的部分代码,详细阐述了new/delete的工作流程,并剖析了new和array new内存泄漏的情况。

2022-05-21 17:11:36 426

原创 源码编译各架构下Qt

Qt的安装方式有许多,最方便的肯定是官网可以直接下载安装的基于x86架构的安装包直接安装了,但是在各行各业都要求全国产化的今天,对于一个linux软件开发者来说,能够在一台x86架构的主机上编程已经是奢求了。看过了许多Qt在不同架构上的安装办法,觉得还是编译Qt源码的方式最为通用、实用。

2022-04-29 14:42:17 614

转载 C++同步阻塞队列

用同步阻塞队列解决生产者消费者问题。生产者消费者问题:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。//SyncQueue.hpp#include <list>#

2022-03-16 09:20:21 271

原创 Qt日志打印

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){ static QMutex mutex; mutex.lock(); QString text; switch((int)type) { case QtDebugMsg: text = QString("Debug:"); bre

2022-03-14 10:49:22 1911 2

原创 Qt程序打包发布与把可执行文件和编译文件分开放置

1. 将Qt程序打包到其他计算机上运行;2. 将文件编译产生的中间文件和可执行文件分开存放。

2022-03-04 17:51:33 629

原创 ubuntu安装Qt5.14.2

下载Qt安装包官网下载速度较慢,可以从国内镜像下载。清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/中国互联网络信息中心:https://mirrors.cnnic.cn/qt/安装包名称:qt-opensource-linux-x64-5.14.2.run./qt-opensource-linux-x64-5.14.2.run安装好后需要一些配置才能开始开发

2022-01-17 10:06:25 3014

原创 ubuntu20.04开启SSH远程登录

默认情况下,首次安装Ubuntu时,不允许通过SSH进行远程访问。以root 用户或具有sudo特权的用户执行以下步骤,以在Ubuntu系统上安装并启用SSH:打开终端并安装openssh-server软件包sudo apt updatesudo apt install openssh-server出现提示时,输入密码,然后按Enter继续安装。安装完成后,SSH服务将自动启动。您可以通过键入以下命令来验证SSH是否正在运行:sudo systemctl status ssh输出应告诉

2022-01-17 09:47:42 34359

原创 Linux设置软件开机自启动的三种方式(中标麒麟、银河麒麟、ubuntu)

方法利用Linux的 .desktop文件实现开机启动。在/etc/xdg/autostart 目录下建立一个 test.desktop文件,并对文件进行以下编辑。操作步骤第一步:打开/etc/xdg/autostart目录cd /etc/xdg/autostart第二步:建立test.desktop文件touch test.desktop第三步:编写文件并保存sudo vim test.desktop添加如下代码:[Desktop Entry]Name=TestExec=/

2022-01-10 14:41:48 36234 4

转载 ubuntu20.04开机自动登录root用户

Ubuntu20.04安装完成之后,默认是没有root账户登录权限的,这样在操作系统时有诸多不便,比如新建一个文件都提示权限不够!不过可以通过创建的普通用户获取管理员权限,然后修改配置和root账户的密码,最后实现系统自动登录root账户,具体操作步骤如下。 1、设置/修改root用户密码 在终端输入命令: sudo passwd root 输入密码并确认一次密码(密码不可见)。 2、修改配置文件 2....

2022-01-10 11:26:37 5623 10

原创 libnet库的安装与使用

1 安装sudo apt-get install libnet1-dev2 使用头文件:#include <libnet.h>编译时加:-lnet利用libnet函数库开发应用程序的基本步骤:数据包内存初始化构造数据包发送数据释放资源相关函数:libnet_t *libnet_init(int injection_type, char *device, char *err_buf)功能: 数据包内存初始化及环境建立参数: injection_type

2021-10-21 10:46:12 2383

原创 libpcap库的安装与使用

1 安装sudo apt-get install libpcap-dev2 使用需要包含的头文件:#include <pcap.h编译的时候需要加:-lpcap利用libpcap函数库开发应用程序的基本步骤:打开网络设备设置过滤规则(可选)捕获数据关闭网络设备常用函数:pcap_lookupdev( )(可选) 查看设备名,返回网卡名pcap_t *pcap_open_live(const char *device,int snaplen,int promisc,

2021-10-20 17:30:11 4423

原创 cin(>>)、fgets、cin.getline函数区别(附加strlen函数)

cin(>>)fgetscin.getline不会读入回车键,遇到空格键、Tab键、回车键直接结束。(空格键、Tab键后内容会留存在缓冲区内)会读入回车键,遇到空格键、Tab键、不会结束,遇到回车键结束。(所有按键都会读入)不会读入回车键,会读取整行内容,遇到回车键结束。(空格键、Tab键内容也都会读入)...

2021-10-19 18:19:08 444

原创 Linux使用原始套接字从链路层开始封包组包(IP数据包)

#include <netinet/ip.h>#include <netinet/udp.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sys/types.h>#include <cstring>#include <sys/ioctl.h>#include <net/ethernet.h>#include <net/if.h

2021-10-19 17:18:52 1063

原创 Linux使用原始套接字从链路层开始封包组包(ARP请求与应答)

#include <iostream>#include <sys/socket.h>#include <netinet/ether.h>#include <arpa/inet.h>#include <unistd.h>#include <net/if.h>#include <netpacket/packet.h>#include <cstring>#include <sys/ioctl.h&

2021-10-15 16:57:57 463

原创 C++变参函数

void SetLastErrorInfo( const char *szModule_, const char *szInfo_, ... ){ char szErr[MINSHORT] = ""; va_list vaArgs; va_start(vaArgs, szInfo_); _vsnprintf(szErr, sizeof(szErr)-1, szInfo_, vaArgs); _snprintf(_szLastError, sizeof(_szLast

2021-09-07 09:10:08 263

原创 使用TFTP协议下载文件

TFTP协议最初用于引导无盘系统,被设计用来传输小文件TFTP基于UDP协议。TFTP的编程思想 和 UDP一样TFTP:简单文件传送协特点:基于UDP协议实现不进行用户有效性认证数据传输模式:octet:二进制模式netascii:文本模式mail:已经不再支持TFTP通信过程总结(无选项)服务器在69号端口等待客户端的请求服务器若批准此请求,则使用临时端口与客户端进行通信每个数据包的编号都有变化(从1开始)、逐次递增每个数据包都要得到ACK的确认如果出现超

2020-12-22 01:08:36 898

原创 自写简单的抓包程序

需要清楚以太网帧头结构,tcp报头结构、udp报头结构#include <stdio.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/ether.h>#include <unistd.h>#include <stdlib.h>#include <arpa/inet.h>int main(){ int sockfd;

2020-12-04 17:54:11 1013

原创 itoa()、atoi()函数C++实现

#include <iostream>#include <string.h>using namespace std;char* int2str(int num) { char* buf = new char[10]; memset(buf, 0, 10); int temp = num < 0 ? -num : num;//取num的绝对值temp int i = 0; while (temp != 0) { buf[i++] = (temp % 10)

2020-11-19 22:34:42 343

原创 模式匹配之BF算法和KMP算法

两种算法主要差别就是指针回溯的位置,KMP算法去除了BF算法中很多重复的比较#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>//使用数组下标的方式比较,如果找到返回子串在主串中的位置,没找到返回-1int BF(const char* str,const char* substr) { if (str == NULL || subst

2020-11-19 17:40:29 255

原创 进程间通信方法三:本地套接字domain

代码中注释已写的很详细,就不多言了注意事项保证套接字文件在同一个目录下网络套接字与本地套接字使用的结构体不同网络套接字采用的结构体为struct sockaddr_in本地套接字采用的结构体为struct sockaddr_un服务端offsetof宏函数原型#define offsetof(type,member) ((int)&((type*)0)->MEMBER#include <stdio.h>#include <sys/soc

2020-11-17 22:21:25 167

原创 epoll函数之边缘触发、水平触发、非阻塞IO模式

边沿触发与水平触发这两个实际是由模拟电路上的高低电频来的,低电压(0)到高电压(1)为上升沿,高电压(1)到低电压(0)为下降沿,高电压(1)到高电压(1)为水平沿。水平沿对应水平触发,上升、下降沿对应边沿触发边沿触发:epoll ET模式水平触发:epoll LT模式通俗的说,当客户端向服务端写数据,假如1000B的数据,服务端第一次读了500B后,还剩下500B在缓冲区中,假如此时能触发epoll_wait函数的监听读事件,就叫水平触发,假如此时epoll_wait函数不触发,那么就

2020-11-12 22:39:51 394

原创 多路IO转接服务器实现方法三:epoll()函数

epoll是Linux下多路复用接口select/poll的增强版本。它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用每次等待时间之前都必须重新准备要被监听的文件描述符集合获取事件的时候,它无须遍历整个被监听的文件描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了目前epoll是Linux大规模并发网络程序中的热门首选模型除了提供select/poll那种IO事件的电平触发外,还提供了边沿触发,这使得

2020-11-12 18:31:50 146

原创 多路IO转接服务器实现方法二:poll()函数

相较于多路IO转接服务器实现方法一:select()函数,使用poll()函数的优点有文件描述符的上限可以突破1024select()函数监听集合与返回的满足监听条件的集合为一个集合,而poll函数将监听集合与符合监听条件的集合实现了分离搜索满足条件的文件描述符的范围缩小了但,poll函数不能实现跨平台,只能在Linux平台上使用,而select()函数可以跨平台poll()函数函数原型int poll(struct pollfd *fds, nfds_t nfds, int timeou

2020-11-11 21:22:00 138

原创 多路IO转接服务器实现方法一:select()函数

采用多进程与多线程的方法来实现并发服务器时,监听的工作由server应用程序自身通过accept函数不断去监听。当客户端连接较多时,这种方法会大大降低程序执行效率,消耗CPU资源(CPU需要在不同进/线程中切换执行)。多进程与多线程实现并发服务器方法可以参考以下两篇文章:多进程并发服务器实现多线程并发服务器实现因为以上两种方法的局限性所以出现了采用多路IO转接的方式来设计服务器,该类服务器实现的思想为应用程序本身不在监听客户端连接,转而由内核来代替监听。主要使用的方法有三种,其一为 select

2020-11-11 14:06:59 107

原创 Linux系统编程之多进程并发服务器简单实现

服务端#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<sys/socket.h>#include<arpa/inet.h>#define PORT 8888#define IP "127.0.0.1"void

2020-11-08 22:10:40 193

原创 Linux系统调用函数read()返回值判断

函数原型read(int fd,void* buf,size_t count);函数说明将从文件描述符fd对应的文件中读到的数据存在buf缓冲区中,每次读count字节,同时文件指针会随着移动函数返回值当返回值大于0时:实际读到的字节数返回值=0:说明数据读完了,(读到文件、管道、socket末尾)返回值为-1:异常errno == EINTR 被信号中断errno == EAGAIN(EWOULDBLOCK) 非阻塞方式读,并且没有数据其他值 代表 出现错误,可以获得返回值,然后利

2020-11-07 15:02:14 5079

原创 vim中配置C/C++环境

在vim中配置C/C++环境:详见地址:包括代码函数自动补全、括号自动补全与详细的配置步骤等,基本是一个完整的代码编辑器配置完后如果使用Xshell连接Linux虚拟机不能在vim中自由复制,需要到.vimrc文件中找到set mouse = a一行,将其改为set mouse=csyntax on说明:第一行:设置成命令行模式,设置完成后代码高亮会消失;第二行:设置代码高亮。...

2020-11-07 12:16:32 931

原创 Linux系统编程之多线程并发服务器简单实现

服务端#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<pthread.h>#include<sys/socket.h>#include<arpa/inet.h>#define IP "127.0.0.1"#define PORT 7777int c

2020-11-07 12:03:56 218

原创 Linux系统编程之进程间通信二:内存映射区

1 内存映射区1.1mmap函数函数功能创建内存映射将磁盘文件的数据映射到内存中,用户通过修改内存就能修改磁盘文件函数原型length:大小为4K的倍数,且不能为0。一般文件多大,映射区的大小就指定为多大prot:PROT_READ:映射区必须要有读权限PROT_WRITE读写权限是:PROT_READ|PROT_WRITEflags:MAP_SHARED:修改了内存数据会同步到磁盘MAP_PRIVATE:修改了内存数据不会同步到磁盘fd:要映射的文件

2020-10-26 21:06:49 200

原创 进程间通信方法一:管道:pipe()、fifo

管道管道的实现原理是内核使用循环队列机制,借助内核缓冲区(4K)实现管道的局限性:由于管道采用半双工的通信方式,所以数据只能在一个方向上流动,要不读要不写(读、写只能占一样)数据一旦被读走,便不在管道中留存,只能读取一次只能在有公共祖先的进程间使用管道pipe函数函数原型int pipe(int pipefd[2]);返回值成功返回0;失败返回-1函数调用成功后,返回两个文件描述符(r/w),无需手动open,但需手动closepipefd[0]:读文件描述符pipefd[1

2020-10-25 17:53:08 181

原创 Linux系统编程之wait()函数回收子进程

函数原型pid_t wait(int* status);返回值成功:清理掉的子进程ID失败:-1(没有子进程)函数功能阻塞等待子进程退出回收子进程残留资源获取子进程结束状态进程终止时,操作系统会进行隐式回收。包括关闭所有的文件描述符,释放用户空间分配的内存。但是此时进程控制块PCB仍然会残留在内核中,保留着此进程结束的状态#include<stdio.h>#include<stdlib.h>#include<unistd.h>#in

2020-10-25 13:33:51 260

原创 Linux系统编程之readdir()函数判断目录是否为空的问题

由于Linux目录中总是存在”.“、”.“两个隐藏目录,所以在用readdir()函数判断是否为空时,得到的结果总是目录不为空。但是现实中对于如果目录中没有自己的文件就应该被判为空,所以在多次测试之后得到下面这段判断目录是否为空的方法。第一种代码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#includ

2020-10-21 16:48:20 2476 2

原创 使用fork()函数循环创建N个子进程

在使用fork()函数进行创建子线程的时候,如果没有在创建成功子进程时选择break跳出for循环,那么子进程也会进入for循环,开始调用fork()函数创建“孙子”进程,所以在创建子进程成功的时候就直接选择break跳出循环,使得if(pid == 0)为子进程的唯一出口,而父进程的唯一出口就是当for循环执行完毕后。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 i

2020-10-11 17:10:40 1198

原创 C语言实现二叉树的遍历,拷贝等操作

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Binary { char ch; struct Binary* Lchild; struct Binary* Rchild;};//计算二叉树的叶子结点数量void calculuteLeafNum(struct Binary* root, int* pNum.

2020-10-09 15:20:02 974

原创 栈的应用:检测小括号是否匹配( C语言实现)

5+5*(6)+9/3*1)-(1+3(算法思路:从第一个字符开始扫描当遇见普通字符时忽略当遇见左括号时压入栈中当遇见右括号时从栈中弹出栈顶符号,并进行匹配 匹配成功:继续进入下一个字符 匹配失败:立即停止,并报错结束;成功:所有字符扫描完毕,且栈为空失败:匹配失败或所有字符扫描完毕但栈非空代码中栈的函数来源#include "stack.h"void error_show(char* str, char* p) { int num = p - str;.

2020-09-30 17:14:29 590

原创 C语言实现链栈的入栈、出栈等操作

采用链表来模拟栈的出入栈操作,将头结点指向的位置设置为栈顶,这样对于插入删除来说效率更高。#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>//栈的节点结构体struct StackNode { struct StackNode* next;};//栈表struct StackList { int m_size; stru

2020-09-29 21:39:35 2376

udev库(armv8下可用;v7没试过)

编译好的udev库,里面包括了libudev.h头文件和库,在项目中引入头文件即可使用。 (arm平台下的)

2022-09-15

Qt发布中可能遇到的问题

Qt发布中可能遇到的问题

2022-08-03

boa和两个win虚拟网卡 .zip

里面有boa-0.94.13.tar.gz还有一个可以设置windows虚拟网卡的软件,

2021-10-21

netassist.zip

网络调试助手

2021-10-20

Win64OpenSSL-1_1_1d.zip

OpenSSL1.1.1d

2021-09-22

Serial port debugging tool.zip

串口调试工具

2021-09-14

TFTP协议服务端软件

用来代码测试,写了客户端后,连接此服务端,下载软件,测试代码是否OK

2020-12-22

netcat-0.7.1.tar.gz

这几天学习Linux网络编程的时候,由于用到了nc命令,无法通过yum下载,所以特地下载的netcat命令的软件包

2020-11-08

vim配置C/C++开发环境.zip

vim配置C/C++开发环境,包括函数补全小括号补全等等,基本跟ide差不多,内附步骤。 注:vim中需要使用tab键来调出下拉框

2020-11-07

PacketTracer.zip

用idm从思科官网上花费n年下载的Cisco Packet Tracer。压缩包内包含一个linux版本(.deb)和一个windows版本(.exe)共两个安装包,供大家学习用!

2020-08-14

PacketTracer_731_amd64.deb

用idm从官网下载了n年的PacketTracer,是linux桌面版的,版本号7.3.1。供大家学习用!

2020-08-13

空空如也

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

TA关注的人

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