- 博客(88)
- 资源 (3)
- 收藏
- 关注
原创 mmap 文件不能为空
mmap 文件不能为空void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);mmap 讲过的人太多了。写这篇的目的,是为了记录今天使用过程中遇到的一个问题:当映射内存大小大于文件大小时,将导致映射内存无法读写,程序报段错误;说三遍:文件不能为空!文件不能为空! 文件不能为空!先
2021-05-18 23:38:32 812
原创 cmake新鲜出炉,明天实战
cmake一款开源项目构建工具,特点开放源代码,使用类 BSD 许可发布。跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。能够管理大型项目,KDE4 就是最好的证明。简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autoto
2021-05-17 23:59:04 272 1
原创 gtest总结
gtest 总结gtest without mainGoogle的C测试框架有两个输出库:一个是gtest.lib,另一个是gtest_main.lib。依赖gtest.lib 需要实现自己的入口函数mainint main(int argc, char* argv[]){ testing::AddGlobalTestEnvironment(new FooEnvironment); ::testing::InitGoogleTest(&argc, argv); return RU
2021-05-07 01:06:25 2808 3
原创 关于用户态和内核态内存拷贝的思考
陷入内核时,内核指针传入内核以copy_from_user为例内核指针映射用户指针映射基础知识:内核内存地址 3G-4G;用户内存地址 0G-3G虚拟指针的最高两位[00 -11) 说明时用户虚拟地址;最高两位11 内核虚拟地址根据虚拟地址的最高两位 来判断访问TTBR0_EL1 或者TTBR0_EL0; TTBR0_EL 存放页表基地址,达到访问不同的页表的目的。才...
2020-05-04 22:29:18 3684
转载 设备树
什么是设备树在Linux3.x之前的内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录。为了解决这个问题而引入设备树。官方对设备树的描述是,一种描述硬件资源的数据结构。它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。设备树的主要优势:对于同一SOC的不同主板,只需更换...
2020-05-04 22:18:23 1485
原创 protocol buffer 深入剖析编解码
链接: https://pan.baidu.com/s/15keEk1oKeqTH4wYjzj-UwQ 提取码: pqek
2019-12-10 17:14:05 191
原创 C++初始化列表
C++类构造函数初始化列表构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExam...
2019-05-14 22:37:49 121
转载 Makefile 笔记
makefile文件转自//https://seisman.github.io/how-to-write-makefile/introduction.html#:= 前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。+= 操作符给变量追加值?= ,先看示例:FOO ?= bar其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先...
2019-05-12 12:53:25 145
原创 shell script 3
passwd root 修改密码history -c 清除历史命令shell filename.sh 命令解析器执行脚本。修改文件权限 和路径之后可以直接执行脚本文件名字chmod +xsleep numoftime 睡眠一段时间ifconfig eth0 获取网卡的信息history # !+编号 可以执行相关命令service ** start / re...
2019-04-23 00:11:01 217
原创 c++ 友元
友元(友元函数、友元类和友元成员函数) C++友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以friend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。1、友元函数友元函数是指非类成员却能够...
2019-03-26 14:29:53 238
原创 shell script 2
shell 的基本元素#!/bin/bash(shell) 指出解释本程序的shell#注释变量控制一般步骤:编辑文件,保存文件,将文件赋予可执行的权限,运行及排错一般以.sh为文件后缀。没有也能执行。执行方式:./filename sh run.shshell的一般结构shell类型函数function funcname(){}主过...
2019-03-21 20:11:43 148
原创 shell script 1
设置文件夹mkdir ~/bin添加环境变量修改 /etc/profile,添加如下字段PATH=$PATH:$HOME/binexport PATH注意:等号前后不能有空格;千万不要漏写$PATH:执行如下命令,配置环境变量成功,即可在任何目录下,使用bin目录下的命令脚本source /etc/profile创建脚本文件#创建目录:mkdir -...
2019-03-20 18:06:08 97
转载 守护进程
1.守护进程启动方法系统初始化脚本启动,/etc目录/etc/rc目录开头的某个目录里。拥有超级用户权限inetd超级服务器启动,inetd有某个脚本启动。cron根据规则定期执行一些程序,这些程序作为守护进程运行at 用于指定将来某个时刻的程序执行,时刻到了由cron启动。用户终端 前台 或者后台都可以启动,用于测试2.通过穿件一个数据包套接字,并绑定log路径名,捆绑...
2019-03-01 21:11:54 124
原创 IPv4 客户与IPv6服务器_UNP
1.让服务监听在ipv6的模式下(这样既可以接收ipv4客户端,也可以接收ipv6客户端。如果监听在ipv4模式下,则只能接受ipv4客户的连接)2.客户端判断自己的网络环境,如果是ipv4则连接服务器的ipv4地址,若ipv6则连接服务器的ipv6地址即可。因为服务器监听在ipv6的模式下,所以ipv4的客户端到达服务器时,服务器主机内核的网络模块会自动将ipv4地址补齐到ipv6的地址格式...
2019-02-28 20:27:26 1660 2
原创 Google test CheatSheet——open source
how to use gtestForDummies-- start here if you are new to Google Mock. CheatSheet-- a quick reference. CookBook-- recipes for doing various tasks using Google Mock. FrequentlyAskedQuestions--...
2019-02-21 21:42:08 576
原创 UDP的connect函数-读书笔记
UDP是一个无连接的协议,它没有像TCP中EOF之类的东西。8.11 UDP的connect函数除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。对于已连接UDP套接字,与默认的未连接UDP套接...
2019-02-16 18:29:29 203
原创 linux 基本操作
一、注意事项 命令和参数之间必需用空格隔开,参数和参数之间也必需用空格隔开。 一行不能超过256个字符;大小写有区分。二、特殊字符含义 文件名以“.”开头的都是隐藏文件/目录,只需在文件/目录名前加“.”就可隐藏它。 ~/ 表示主目录。 ./ 当前目录(一个点)。 ../ 上一级目...
2019-02-16 14:53:25 214
原创 linux select函数
使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。下面详细介绍一下!1、select...
2019-01-27 16:25:50 1551
原创 Unix 网络编程函数返回值
创建套接字──socket()SOCKET PASCAL FAR socket(int af, int type, int protocol);该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,:AF_UNIX、AF_INET、AF_NS等,而DOS、 WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type 描述要建立...
2019-01-08 11:05:14 356
转载 Linux网络编程——理解异步I/O
转载:https://www.cnblogs.com/hustcat/archive/2010/04/10/1708909.html 对于服务器程序,I/O是制约系统性能最关键的因素。对于需要处理大量连接的高并发服务器程序,异步I/O几乎是不二的选择。Linux和Windows都为异步I/O构建了大量的基础设施。本文总结了一下Linux和Windows下的异步I/O模型,并给出了一些...
2019-01-06 14:33:14 754
转载 Linux网络协议栈——链路层
转载:https://www.cnblogs.com/hustcat/archive/2009/09/22/1572108.html1、接收帧当网络适配器接收到数据帧时,就会触发一个中断,中断处理程序执行一些需要及时处理的任务,然后在下半部进行其它可以延迟的处理。中断处理程序主要进行以下一些操作:(1) 分配sk_buff数据结构,并将接收到的数据帧从网络适配器I/O端口拷贝到sk_...
2019-01-06 14:02:59 264 1
转载 Linux下的I/O
转载//https://www.cnblogs.com/hustcat/archive/2009/09/18/1569661.html Linux的I/O机制经历了一下几个阶段的演进:(1)同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。(2)同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/...
2019-01-04 14:32:59 133
转载 Linux网络协议栈(一)——Socket
转载:https://www.cnblogs.com/hustcat/archive/2009/09/17/1568738.html 尊重原创,支持原创1、TCP/IP参考模型为了实现各种网络的互连,国际标准化组织(ISO)制定了开放式系统互连(OSI)参考模型。尽管OSI的体系结构从理论上讲是比较完整的,但实际上,完全符合OSI各层协议的商用产品却很少进入市场。而使用TCP/IP 协议的...
2019-01-03 15:45:01 296
原创 linux中的链表容器思想
//include/linux/list.h struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) struct li...
2019-01-02 14:07:00 156
原创 菱形虚继承遇到多态(虚函数表)
#include <iostream>using namespace std;class Base{public: int intBase1 =1; Base() { cout << "Base" << endl; } virtual void func1() { cout << "Base_func1" <&
2018-12-27 22:45:24 159
原创 Unix/Linux系统中的时间
时钟可以说是计算机的心脏,它是分时系统的基础。如果时钟反应到应用程序的层面,就是时间,很多应用程序都会涉及到时间处理。本文就来讨论一下计算机中的时钟与时间。1、操作系统中的时间在Unix/Linux系统中,有两个不同的时间:日历时间和进程时间。有些书上又叫系统时间。该值是自1970年1月1日00:00:00以来国际标准时间(U T C)所经过的秒数累计值(早期的手册称U T C为格林尼治...
2018-12-26 20:12:07 683
原创 C++ 标准库读书杂记9 extern “C” C++与C的混合编程
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern "C"是连接申明(linkage declaration),被ext...
2018-12-26 19:52:41 126
转载 进程间的五种通信方式介绍
转:https://blog.csdn.net/wh_sjc/article/details/70283843#commentBox进程间通信(IPC)介绍进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socke...
2018-12-26 17:41:11 189
转载 网络协议栈系列之Linux的I/O
Linux的I/O机制经历了一下几个阶段的演进:(1)同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。(2)同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。(3)异步阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来...
2018-12-26 16:28:11 242
转载 网络协议栈系列之整体流程
转载链接:https://www.cnblogs.com/sammyliu/p/5225623.html Linux 网络路径 1.1 发送端1.1.1 应用层(1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的。Linux Socket 是从 BSD Socket 发展而来的,它是 L...
2018-12-26 14:38:20 1183
原创 C++ 标准库读书杂记8 浅析std::move
首先站在C ++ 的角度说一下左值和右值;右值:不具名的变量左值:具名变量其实呢概念上说不具名,隐含的意思就是作用域非常小的变量。站在内存的角度上没啥区别,主要在编译器角度上判断变量生命周期,他所在的地址是否可以再次被使用。那么这种在生命周期末尾的变量我们都可以叫做右值,所以右值我觉得描述的是即将被释放的变量。大可不必去纠结什么左值引用,右值引用,那是语法规则层面的东西。只要进去的...
2018-11-24 18:07:46 244
转载 c++11 类默认函数的控制:"=default" 和 "=delete"函数
转自:https://www.cnblogs.com/lsgxeva/p/7787438.html #define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <vector>#include <map>//c++11 类默认函数的控制:"...
2018-11-19 15:50:22 123
原创 C++ 标准库读书杂记7 Smart Pointer
C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。使用 raw pointer 管理动态内存时,经常会遇到这样的问题:忘记delete内存,造成内存泄露。 出现异常时,不会执行delete,造成内存泄露。智能指针主要有三种:shared_ptr,uni...
2018-11-07 02:36:32 204
原创 白话KMP
1.明确概念 最长前缀和最长后缀:例如abab ab`==ab ``(`前缀,``后缀)这个长度就是2。next[]:存放T以长度j切割的对应字符串的最长相等前后缀的长度。 2.明确变量P:表示被查询字符串:“bacbababadababacambabacaddababacasdsd”T:查询字符串:“ababaca”next[]:ababaca,长度是7,所以next...
2018-10-31 17:09:32 113
大白话排序和查找
排序默认采用降序排列1.冒泡排序每次把最小的元素像泡泡一样,放到数组末尾。基本原理:外层循环次数有字符串长度-1决定。内层循环,后一个如果比自己小,就交换位置,第一轮就把最小的放到了最后一个元素位置上。那么下一次循环只需要把第二小的放到倒数第二个位置上,所以内层循环次数随外层循环变量一样变化。优化原理:在内层设置一个检测是否发生数据交换的标致变量,如果某一次循环没有元素交换发生...
2018-10-31 11:25:59 149
转载 shell总结
扩展名为 sh#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。echo 命令用于向窗口输出文本。运行 Shell 脚本有两种方法:1、作为可执行程序chmod +x ./test.sh #使脚本具有执行权限 直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/...
2018-09-24 21:21:30 111
原创 C++ 标准库读书杂记6 Tuple
TupleA tuple is an object capable to hold a collection of elements. Each element can be of a different type.template <class... Types> class tuple;找到一个tuple模板:template<typename Head,...
2018-09-17 23:40:17 176
原创 探讨一下(i++)语意 不是什么先++ 后++
作者:弯弯的丝瓜函数func的定义如下: 1 2 3 4 5 voidfunc(constint& v1,constint& v2) { std::cout << v1 <<' '; std::cout << v2 <<' '; ...
2018-09-16 00:38:51 223
原创 推倒一下时间复杂度
推倒一下对数级时间复杂度for(i = 1;i < n){ i = i *2;}推导:等比数列 a[n] = a[n-1]*2 公比q = 2; 计算次数
2018-09-09 18:58:14 218
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人