- 博客(165)
- 资源 (3)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 系统编程笔记_目录
系统编程笔记_目录C/C++程序编译错误(exec): warning: missing sentinel in function call [-Wformat]
2020-06-20 14:00:21
178
原创 Windows10忘记用户密码?怎么打开电脑?
Windows10忘记用户密码?怎么打开电脑?首先在输入密码的登录界面连续敲5次shift按键进入cmd命令行。输入net user查看用户现在是自己创建的用户忘记密码(我的是Sunrise用户)通过命令net user Sunrise +密码 设置密码,可以看到拒绝访问,因为Sunrise用户的权限不够。虽然权限不够,但是可以修改administrator的密码。输入net user administrstor 123456将超级用户密码设置为123456接下来是
2021-01-31 17:28:09
3638
4
原创 STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float)
STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float) 最近在做毕业设计,在做wifi数据传输与接收时,涉及到了STM32单片机中的数据转换问题,经过一系列查资料终于解决这个烦人的问题!!!! 其中涉及了WiFi的数据传输和WiFi的数据接收:1. WiFi的数据传输(float->u32->u8) WiFi数据传输时,因为使用的是NRF24L01模块,其官方代码是传输的u8类型的数组,但是我需要传输的是经纬
2020-11-11 17:00:33
3629
1
原创 C++可重入函数和不可重入函数
C++可重入函数和不可重入函数可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。不可重入函数是指不能运行在多任务环境下,除非能保证互斥的函数。由于使用了未受保护的系统资源,如全局变量区,中断向量表等。不可重入函数在实时系统设计中被视为不安全函数。可重入函数特点:没有静态数据结构不返回指向静态数据的指针所有函数数据由函数的调用者提供使用auto变量,或通过全局变量的拷贝来保护全局变量若必须访问全局变量,则利用互斥信号保护不调用不可重入函
2020-08-14 16:13:40
3032
原创 HTTP长/短连接
HTTP长/短连接1. 什么是长/短连接2. 长短连接使用场景1. 什么是长/短连接在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加
2020-08-10 15:55:26
247
原创 C++智能指针总结(面试常问)
C++智能指针总结(面试常问)1.智能指针的实现原理2. C++11四种智能指针总结2.1 auto_ptr:2.2 unique_ptr:2.3 share_ptr:2.4 weak_ptr:1.智能指针的实现原理智能指针的实现原理就是在一个类的内部封装了类对象的指针,然后在析构函数里对我们的类对象指针进行释放,因为类的析构是在类对象生命期结束时自动调用的,这样我们就省去了手动释放内存的操作,避免忘记手动释放导致的内存泄漏。2. C++11四种智能指针总结2.1 auto_ptr:auto_
2020-08-10 15:45:53
4793
1
原创 TCP流量控制、拥塞控制和重发机制(快重传和快恢复)详解
TCP流量控制、拥塞控制和重发机制(快重传和快恢复)详解1. TCP流量控制1.1 如何控制?1.2 发送方何时再继续发送数据?1.3 注意点:2. TCP拥塞控制2.1 拥塞控制的原理2.2 慢开始算法2.3 拥塞避免2.4 乘法减小和加法增大2.5 拥塞控制和流量控制的差别3. TCP重发机制(快重传和快恢复)3.1 快重传3.2 快恢复1. TCP流量控制如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,对发送方发送速率的控制,要
2020-08-09 16:27:10
2065
原创 操作系统死锁 四个必要条件
操作系统死锁 四个必要条件操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解除阻塞状态。根据这样的情况,操作系统中的死锁被定义为系统中两个或者多个进程无限期地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分
2020-07-27 18:01:05
8803
原创 c++ map与unordered_map区别及使用
c++ map与unordered_map区别及使用需要引入的头文件不同map: #include < map >unordered_map: #include < unordered_map >内部实现机理不同map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于
2020-07-19 21:23:07
547
原创 线程池 ThreadPool
线程池 TreadPool项目描述: 使用多线程技术,实现了 treadpool 管理多个线程并提供任务队列的接口。在线程池初始化后,将等候在条件变量上的一个线程唤醒并从该任务队列中取出第一个任务给该线程执行,等待任务队列中所有任务执行完成。treadpool 提高了响应的速度和多线程的可管理性,降低了资源的消耗。代码如下:#include <iostream>#include <queue>#include <pthread.h>#include <u
2020-07-12 16:42:05
214
原创 实现简易的基于TCP/IP 协议的聊天室
实现简易的基于TCP/IP 协议的聊天室项目描述:运用 socket 编程,实现了服务端对客户端的广播和转发客户端信息实现客户端聊天操作,并使用 i/o 复用技术中的 epoll 模式解决了一个线程可以处理大量用户连接服务器的请求,提高了服务器并发连接的数量。同时利用线程池来管理各个线程的工作,避免了创建和销毁线程的开销,因此使服务器更加高效。server服务器:// 一服务器 -> 多客户端// 三次握手主要是创建连接// 四次挥手主要是释放资源// I/O复用 epoll模式#
2020-07-12 16:37:28
899
原创 miniSTL 容器
miniSTL 容器项目描述:使用 C/C++基本语法实现了 String、Vector、List、Deque、Stack 类的基本功能,对其封装并嵌套了 迭代器类,和重载了迭代器基本操作,使其支持以迭代器的方式来对容器进行访问。通过 miniSTL 掌握了单 元测试和接口文档的编写。1. 实现一个STL的list容器 封装了list的数据结构,和push_back(),push_front(),pop_back(),pop_front(),size()方法,内嵌了iterator迭代器类,还写了f
2020-07-12 16:22:15
537
原创 C/C++面试题
一、C和C++的区别是什么?C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C中函数不能进行重载,C++函数可以重载C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。C++中struct和
2020-07-09 14:36:57
323
2
原创 TCP和UDP的区别
TCP和UDP的区别1. TCP 是什么2. UDP 是什么3. TCP 和 UDP 的不同1. TCP 是什么 TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。TCP 的特点主要有TCP 能够确保连接的建立和数据包的发
2020-07-09 14:30:27
690
1
原创 Linux系统编程4:IPC消息队列
Linux系统编程4:IPC消息队列0. 消息队列1. POSIX 消息队列1.1 查看0. 消息队列背景管道和套接字比较适合两三个进程之间的通信,如果进程成倍增加,管道和套接字的数量也会阶乘级的增加,管理也非常复杂麻烦。于是出现的消息队列比喻优先级让列宁同志先走本质内核链表1. POSIX 消息队列1.1 查看POSIX消息队列预览:man mq_overview查看POSIX消息队列:ls /dev/mqueuecat /dev/mqueue/PIC名
2020-07-01 18:03:59
210
原创 fcntl函数与dup/dup2函数
fcntl函数与dup/dup2函数1.fcntl函数控制int fcntl(int fd, int cmd, long arg)如果管道是空的,read()默认是阻塞,可以通过fcntl函数改变管道状态,设置为非阻塞防止数据丢失。参数把文件描述符改为非阻塞的fcntl(filedes,F_SETFL,O_NONBLOCK);2.dup/dup2函数dup/dup2标准输入输出重定向函数文件描述符复制内核为每个进程创建的文件描述符。① 函数int dup(int
2020-06-30 17:13:39
445
原创 Linux下IPC方式之管道(pipe,fifo)
Linux下IPC方式之管道(pipe,fifo)1. IPC方法2. 管道2.1 管道的概念2.2 pipe函数2.2.1 父子进程间通信简单举例2.2.2 父子进程实现pipe通信,实现ps aux | grep bash 功能2.3 管道的读写行为1. IPC方法 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓
2020-06-30 16:42:21
611
原创 系统编程-回收子进程-孤儿和僵尸进程,wait和waitpid方法
系统编程-回收子进程-孤儿和僵尸进程,wait和waitpid方法1. 孤儿进程2. 僵尸进程3. 子进程回收3.1 wait1. 孤儿进程孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。危害:没什么危害…产生孤儿进程的举例:#include <stdio.h>#include <unistd.h>int main(){ pid_t pid = fork(); if(pid == 0){
2020-06-28 20:25:14
264
原创 形参与实参的区别
实参(argument):全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。形参(parameter):全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且
2020-06-28 10:25:18
663
2
原创 系统编程-如何用fork函数创建指定数量个子进程?
系统编程-如何用fork函数创建指定数量个子进程?fork函数:创建一个子进程。pid_t fork(void);失败返回-1;成功返回:① 父进程返回子进程的ID(非负) ②子进程返回0一般我们if(pid == 0){ //子进程}else if(pid > 0){ //父进程 //此时pid为子进程id}pid_t类型表示进程ID,但为了表示-1,它是有符号整型。(0不是有效进程ID,init最小,为1)注意返回值,不是fork函数能返回两个值,而是fork后,fo
2020-06-27 18:57:28
420
原创 系统编程-exec函数族的使用
系统编程-exec函数族的使用 fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户控件代码和数据完全被新程序替换,从新程序的启动例程开始执行。执行exec并不创建新进程,所以调用exec前后该进程的id并未改变。 将当前进程的.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳。 //该函数
2020-06-23 17:44:52
290
原创 Linux系统编程2:进程的创建、结束、停止
Linux系统编程2:进程的创建、结束、停止1.进程操作接口获取PID2.如何创建进程2.1 分叉函数pid_t fork()2.2 执行函数exec()2.3 系统函数int system(Shell字符串)3.如何结束进程4.如何停止进程5.特殊进程1.进程操作接口获取PID进程标识pid:进程身份证号示例#include <stdio.h>#include <unistd.h> int main(){ printf("PID:%dPPID:%d\n
2020-06-23 17:27:11
351
原创 Linux系统编程1:进程基础
Linux系统编程1:进程基础程序与进程如果程序是菜谱,进程就是厨师烹饪;如果程序是乐谱,进程就是乐师演奏;如果程序是剑谱,进程就是剑客舞剑;如果程序是棋谱,进程就是棋士复盘;程序是静的,进程是动的。进程与程序区别概念进程:程序在计算机上的一次执行过程,执行中的程序。进程是一个抽象概念本质程序在地址空间中按照代码逻辑控制流执行资源分配最小单位从代码到程序从程序到进程内核将程序读入内存,为程序镜像分配内存空间。内核为该进程分配进程标志符PID。内核为该
2020-06-23 16:07:23
159
原创 C/C++程序内存布局
C/C++程序内存布局1. 运行可执行程序前的内存分区1.1 代码区`text`1.2 全局初始化数据区/静态数据区(`data`段)1.3 未初始化数据区(又叫 `bss` 区)2. 运行可执行程序后的内存分区2.1 代码区(`text segment`)2.2 未初始化数据区(`BSS`)2.3 全局初始化数据区/静态数据区(`data segment`)2.4 栈区(`stack`)2.5 堆区(`heap`)2.6 堆与栈的区别3. 变量作用域生命周期和储存位置总结1. 运行可执行程序前的内存分区
2020-06-20 17:27:11
1457
原创 实现一个STL的vector容器
实现一个STL的vector容器封装了vector的数据结构,和push_back(),capacity(),size()方法,内嵌了iterator迭代器类#include <iostream>// #include <vector>using namespace std;namespace miniSTL{template<typename T>class vector{ T* _data; size_t _size;// 元素个数
2020-06-19 16:06:14
211
原创 实现一个STL的list容器
实现一个STL的list容器封装了list的数据结构,和push_back(),push_front(),pop_back(),pop_front(),size()方法,内嵌了iterator迭代器类,还写了for_each()和accumulate()模板算法#include <iostream>// #include <algorithm>// #include <list>#include <exception>using namespace
2020-06-19 16:04:47
133
原创 C++智能指针
C++智能指针0.智能指针分类1. `auto_ptr`2. `unique_ptr`3. `scoped_ptr`4. `shared_ptr`5. `weak_ptr`总结指针的危害指针未初始化野指针内存泄漏0.智能指针分类本质:将指针封装为类对象成员,并在析构函数里删除指针指向的内存。不同:auto_ptr、unique_ptr、scoped_ptr马上删除。shared_ptr计数为0删除。weak_ptr不删除。智能指针是来解决指针危害的。1. auto_ptr
2020-06-19 14:01:07
421
原创 实现一个智能指针,使我们在堆上的创建变为栈上,省去手动析构
实现一个智能指针,使我们在堆上的创建变为栈上,省去手动析构,并且重载*和->其实智能指针就是类内维护一个对象指针,然后模拟普通指针,重载了*和->#include<iostream>using namespace std;class Person{public: Person(int age){ this->m_Age = age; } void showAge(){ cout << "年龄为:" << this->m_
2020-06-18 17:00:09
161
原创 C++写时拷贝技术
C++写时拷贝技术1. 深拷贝与浅拷贝概念和优缺点1. 深拷贝与浅拷贝概念和优缺点浅拷贝:只拷贝指针地址。通常默认拷贝构造函数与赋值运算符重载都是浅拷贝。成员变量中没有指针的情况可以直接使用浅拷贝。优点:共享一份内存,节省空间缺点:在释放的时候可能会多次释放,造成内存泄漏深拷贝:重现分配堆内存,拷贝指针指向内容。例如:String类优点:每个指针指向不同的地址,避免了多次的释放缺点:重复数据较多,占用空间...
2020-06-18 16:56:58
360
原创 BOOST基础
BOOST基础1. 简介2. 安装3. 使用3.1 lamdba表达式3.2 容器中存放任意类型值3.3 数据转化3.4指针容器3.5 退出处理3.6 遍历`BOOST_FOREACH`3.7 函数绑定3.8 不可复制类1. 简介C++的一个准标准库2. 安装在线安装Redhat/Centossudo yum install boost-develUbuntusudo apt-get install libboost-dev手动安装大部分boost库的头文件主要由模板和内联
2020-06-16 19:19:36
350
原创 C/C++变量的作用域
C/C++变量的作用域1. 局部变量2. 静态(static)局部变量3. 全局变量4. 静态(static)全局变量5. extern全局变量声明6. 全局函数和静态函数7. 总结C语言变量的作用域分为:代码块作用域(代码块是{}之间的一段代码)函数作用域文件作用域1. 局部变量局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:在一个函数内定义,只在函数范围内有效在复合语句中定义,只在复合语句中有效随着函数调用的结束或
2020-06-16 14:24:17
1036
原创 C++静态库和动态库的制作与使用——类级
C++静态库和动态库的制作与使用——类级0.前提(文件内容)1. 静态库的制作与使用1.1 创建1.2 使用2. 共享库的制作2.1 创建2.2 使用3. 动态链接库的制作3.1 创建3.2 使用4. 总结0.前提(文件内容)test.h#pragma onceclass Test{public: Test(); ~Test(); void Func(int i);};或#ifndef __TEST_H#define __TEST_Hclass Test{pu
2020-06-15 16:52:02
616
原创 C++静态库和动态库的制作与使用——函数级
C++静态库和动态库的制作与使用——函数级1. 静态库的制作与使用1.1 创建1.2 使用2. 动态库的制作与使用2.1 创建2.2 使用3. 动态库与静态库的区别3.1 动态加载与静态加载的区别4. 总结库的作用:分离编译代码重用分类:C语言编译的流程:1. 静态库的制作与使用1.1 创建文件举例:calc.cpp#include <iostream>#include "calc.h"using namespace std;int main(){ i
2020-06-15 16:07:46
291
原创 编写makefile模板且一键创建到当前目录方法
编写makefile模板且一键创建到当前目录方法1. 编写makefile模板2. 添加alias到~/.bashrc3. 更新文件和使用1. 编写makefile模板2. 添加alias到~/.bashrc3. 更新文件和使用
2020-06-15 14:21:54
293
原创 C++_makefile基础
C++_makefile基础1. makefile编写2. 执行makefile文件3. 高级makefile写法(重要)好处:一次编写,终身受益命名规则:makefile、Makefile三要素:目标、依赖、规则命令1. makefile编写写法:目标(target): 依赖(prerequiries)... tap键 规则命令(command)目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或OBJ文件。目标也可是一个执行的动作名称,诸如‘clean’(仅仅表达动
2020-06-13 16:32:46
1425
零基础Labview教程
2019-04-20
python+pyqt5 做上位机界面
2019-04-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人