自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (1)
  • 收藏
  • 关注

转载 单元测试:CMocka单元测试框架(支持mock功能)

CMocka概述官网: https://cmocka.org/源码: https://gitlab.com/cmocka/cmockaCMocka 是一款支持 mock 对象、面向C语言的单元测试框架,CMocka 往往是编译成库的形式,供C单元测试程序链接调用。其前身是谷歌开发的Cmockery,由于后者缺少维护,因此 CMocka 继承了 Cmockery 并继续维护。CMocka 框架的特性:支持模拟对象,可设置模拟函数的期望返回值,期望输出参数,可检查模拟函数的输入参数、函数调用顺序。

2020-12-31 21:57:51 3281 12

转载 单元测试:Test Double

在对被测系统(system under test,简称SUT)进行单元测试(Unit Test)的过程中,经常会出现这种情况,被测系统调用了第三方依赖组件(depended-on component,简称DOC),而这个依赖组件你无法控制(或者还未实现)。为了让单元测试顺利进行,就必须摆脱对这些对象的依赖,通常会使用测试替代(Test Double)技术合理隔离(摆脱)外部依赖项,进而以提高单元测试效率。隔离的单元测试意味着把单元测试中的对第三方组件依赖的部分合理的提取出来,用Test Double取而

2020-12-31 21:33:14 354

转载 单元测试:Mock对象

为什么要引入mock对象单元测试的目标是一次只验证一个方法,小步的前进,细粒度的测试,但是假如某个方法依赖于其他一些难以操控的东东,比如说网络连接,数据库连接,或者是Servlet容器,那么我们该怎么办呢?要是你的测试依赖于系统的其他部分,甚至是系统的多个其他部分呢?在这种情况下,倘若不小心,你最终可能会发现自己几乎初始化了系统的每个组件,而这只是为了给一个测试创造足够的运行环境让它们可以运行起来。忙乎了大半天,看上去我们好像有点违背了测试的初衷了。这样不仅仅消耗时间,还给测试过程引入了大量的耦合

2020-12-31 21:22:07 3092

转载 单元测试:开篇明义

一个单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某个假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能快速运行。单元测试可靠、可读,并且可维护。一个工作单元可以小到只包含一个方法,也可以大到包括实现某个功能的多个类和函数。作为开发人员,或多或少,都在某种程度上进行过单元测试,比如,写完代码在提交之前自己先测试下。也许你是用一个控制台来调用一个函数进行测试,也是是特意创建界面程序来检查某个组件的功能,或是干脆在实际应用程序中进行各种手工操.

2020-12-31 20:46:45 218

转载 automake:hello automake

实践$ mkdir helloword$ cd helloworld$ gedit helloworld.c内容为:#include <stdio.h>int main(int argc, char** argv){ printf("%s", "Hello, Linux World!\n"); return 0;}保存退出$ lshelloworld.c然后我们使用autoscan命令:$ autoscan$ lsautoscan.log c

2020-12-31 16:52:50 187

转载 编译工具:makefile、autoconf、automake、libtool的关系

Autotools比较常见的有autoconf、automake、libtool等包,每个包又有多个工具。使用这几个工具,虽然能帮助我们自动生成Makefile,但是命令过程复杂,中间会生成大量的各种配置文件和脚本。很多人往往会觉得很麻烦、搞不懂里面错综复杂的关系,自己写的一篇文章,希望能帮助大家理理里面的关系。手工makefile时代早期我们在Unix、linux环境下开发软件,makefile都是手写的。通过makefile,我们就可以使用make命令直接去编译我们的源代码。后来,随着Unix版

2020-12-31 15:16:57 2359 1

转载 Unix/Linux编程:数据读写之recv、send、sendto、recvfrom、recvmsg、sendmsg

read和wriet也可以用于读写socket。但是socket编程接口也提供了几个专门用于socket数据读写的系统调用。他们增加了对数据读写的控制TCP数据读写理论#include <sys/types.h> #include <sys/socket.h> /** 作用: 读取sockfd上的数据* 参数: buff 指明存放数据的缓冲区* len 指明缓冲区的长度* flags 一般设置为0* 返回值:.

2020-12-29 17:05:47 1230

转载 Linux C/C++编程:TCP带外数据

首先给出OSI参考模型与TCP/IP协议模型图:概述首先,我们需要知道的是数据分两种,一种是带内数据,一种是带外数据。 带内数据就是我们平常传输或者说是口头叫的数据。带外数据就是我们接下来讲的内容。许多的传输层都具有带外数据(也就是经加速数据)的概念,想法就是连端发生了重要的事情,希望迅速的通知给对端。这里的迅速是指这种通知应该在已经排队了的带内数据之前发送。也就是说,带外数据具有更高的优先级。带外数据不要求再启动一个连接进行传输,而是使用已有的连接进行传输。为什么需要带外数据有时数据 会以

2020-12-29 15:27:04 712

转载 C/C++编程:利用yaml-cpp读写yaml配置文件

yaml-cpp 是一个开源库,地址在 github 上,https://github.com/jbeder/yaml-cppyaml-cpp 是通过 CMake 来进行构建和编译的。所以你的系统中必须先安装了cmake准备首先下载源码。然后,在源码目录创建一个 build 文件夹。mkdir build进入到 build 文件夹,然后执行 cmake 命令。cd buildcmake ..注意的是 cmake 后面是 …,这代表从 build 上一层目录查找 CMakeLists

2020-12-29 11:45:06 3032

转载 Unix/Linux编程:五种I/O模型

阻塞IO在Linux中,默认情况下所有的socket都是阻塞的,一个典型的读操作流程如下:第一步通常涉及等待数据从网络中到达。当所有等待数据到达时,它被复制到内核中的某个缓冲区第二步就是把数据从内核缓冲区复制到用用程序缓冲区当用户进程调用recvfrom这个系统调用时,kernel就开始了IO的第一个阶段:准备数据,就是数据被拷贝到内核缓冲区中的一个过程(很多网络IO数据不会那么快到达,如没收一个完整的UDP包),等数据到操作系统内核缓冲区了,就到了第二阶段:将数据从内核缓冲区拷贝到用户内存,

2020-12-28 20:08:41 693 2

转载 C标准库:<ctype.h>

C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符。这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符号字符。如果参数 c 满足描述的条件,则这些函数返回非零(true)。如果参数 c 不满足描述的条件,则这些函数返回零。字符类isalnum()/** 功能: 检查所传的字符是否是字母和数字* 返回值: 如果 c 是一个数字或一个字母,则该函数返回非零值,否则返回 0。*/int isalnum(int c);#include &.

2020-12-28 15:05:55 528

转载 深入理解计算机系统: 系统IO

引入输入/输出 (1 0) 是在主存和外部设备(例如磁盘驱动器、终端和网络)之间复制数据的过程输入操作是从 设备复制数据到主存输出操作是从主存复制数据到 1/0 设备所有语言的运行时系统都提供执行 的较高级别的工具 例如:ANSI 提供标准库,包含像 printf scanf 这样执行带缓冲区的 函数。C++ 语言用它的重载操作符 << (输入)和>>(输出)提供了类似的功能。在 Linux 系统中,是通过使用由内核提供的系统级 UnixI/O 函数来 实现这些较高级别的 I/0 函数的

2020-12-28 11:31:54 820

转载 Linux C/C++编程:lseek、fseek、ftell、rewind、fgetpos、fsetpos、

rewind、fseek、ftell为C库函数,lseek为系统函数/** 功能: 设置文件位置为给定流 stream 的文件的开头* 参数: stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流*/void rewind(FILE *stream)#include <stdio.h>/** 功能: 返回给定流 stream 的当前文件位置。* 参数: stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。* 返回值.

2020-12-28 11:08:08 3570

转载 Linux C/C++编程:打开读取关闭目录

理论#include<sys/types.h>#include<dirent.h>/** 功能: 打开一个目录,在失败的时候返回一个空的指针。* 参数: 路径名* 返回值:指向目录流 (directory stream) 的指针(执行path目录下所有文件和目录的列表)* 错误代码:* 1、EACCESS 权限不足。* 2、EMFILE 已达到进程可同时打开的文件数上限。* 3、ENFILE 已达到系统可同时打开的文件数上限

2020-12-28 10:13:36 618

转载 Unix/Linux编程:数据读写之write、fwrite、read、fread

write/read是linux下的底层系统调用函数,fwrite与freadc/c++下的标准I/O库函数理论#include <unistd.h>/** 功能 : 从描述符为fd的当前文件位置复制最多n个字节到内存位置buf* 参数:* fd 文件指针* buf 读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移* __nbytes 是请求读取的字节数。若参数count 为0, 则read()不会有作用并返回0. 返回.

2020-12-28 09:33:12 3015

转载 Unix/Linux编程:getitimer、setitimer、alarm

alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。可以设置忽略或者不捕获此信号,如果采用默认方式其动作是终止调用该alarm函数的进程。#include<unistd.h>/** 参数: seconds:指定秒数* 返回值: * 成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。* 出错:-1*/unsigned int alarm(unsig.

2020-12-27 23:27:40 397

翻译 cmake:pkg_check_modules

此文为:轻松入门cmake系列教程理论是什么?pkg_check_modules是 CMake 自己的 pkg-config模块的一个用来简化的封装:你不用再检查 CMake 的版本,加载合适的模块,检查是否被加载,等等,参数和传给 find_package 的一样:先是待返回变量的前缀,然后是包名(pkg-config 的)。这样就定义了<prefix>_INCLUDE_DIRS和其他的这类变量,后续的用法就与find_package一致。工作原理当安装某些库时(例如从RPM,d.

2020-12-27 21:50:05 20961 16

转载 centos7:设置阿里镜像

备份原来的yum源sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 设置aliyun的yum源sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 添加EPEL源EPEL(http://fedoraproject.org/wiki/EPEL)是由.

2020-12-27 10:54:49 272

转载 cmake:设置编译选项

此文为:轻松入门cmake系列教程实践1、 cmake debug和release设置# default is "Debug"#set(CMAKE_BUILD_TYPE "Release")2、启用Makefile版本中的详细输出。# set this to see the compilation commands# set(CMAKE_VERBOSE_MAKEFILE 1)3、根据cmake的debug和release设置编译选项IF("${CMAKE_BUILD_TYPE}" .

2020-12-26 14:52:17 29822 4

转载 cmake:find_package 添加依赖库

此文为:轻松入门cmake系列教程引入库文件时,我们必须知道头文件的路径还有库文件的路径在cmake某个程序的时候,经常会提示找不到某个所依赖的库,那么这是时候我们就需要检查我们引入依赖库的路径对不对了, Cmake中一个自动寻找函数find_package()可以帮我们实现这个功能。实践例子1:opencvCMakeFileLists.txtfind_package( OpenCV REQUIRED )if (OpenCV_FOUND) include_directories( ${O.

2020-12-26 00:47:53 5132

转载 cmake:add_library生成静态库和动态库

此文为:轻松入门cmake系列教程下一篇:我们将说明如何链接库有时我们只需要编译出动态库,静态库,然后等着让其它程序去使用。让我们看下这种情况该如何使用cmake实践编写代码项目结构如下:/*** testFunc.c*/#include <stdio.h>#include "testFunc.h"void func(int data){ printf("data is %d\n", data);}/*** testFunc.h*/#ifnd..

2020-12-26 00:29:55 28870 13

转载 cmake:不同目录下多个源文件

此文为:轻松入门cmake系列教程前文为:cmake:同一目录下多个源文件

2020-12-25 23:29:50 10695

转载 cmake:同一目录下多个源文件

此文为:轻松入门cmake系列教程

2020-12-25 23:10:09 8399 2

转载 cmake:Hello cmake

首先让我们从最简单的代码入手,先来体验下cmake是如何操作的编写代码mycmake$ tree.├── CMakeLists.txt├── main.cppmain.cpp内容如下:#include <stdio.h>int main(void){ printf("Hello World\n"); return 0;}CMakeLists.txt# cmake的最低版本要求是2.8cmake_minimum_required (VERSION 2.8)

2020-12-25 22:56:20 851

原创 cmake:centos、win中安装cmake

当前centos版本cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)安装centso安装1、下载cmake官网然后安装依赖:$ yum install -y gcc gcc-c++ make automake$ yum install openssl-devel2、解压# tar -xvf cmake-3.17.3.tar.gz# cd cmake-3.17.3/# ./configure# gmake

2020-12-25 22:30:58 1036 2

转载 Linux C/C++编程: 文件操作open/close、fopen与freopen/fclose

open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲。linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系统调用open。所以在linux下如果需要对设备进行明确的控制,那最好使用底层系统调用(open)open对应的文件操作有:close, read, write,ioctl 等。fopen 对应的文件操作有:fclose, fread, fwrite, freopen, fseek, ftell, re

2020-12-25 17:51:21 9314

转载 C/C++编程:从0到1学习libuv(linux、Clion)

libuv强制使用异步和事件驱动的编程风格。它的核心工作是提供一个event-loop,还有其他基于IO和其他事件通知的回调函数。libhv还提供了一些核心工具,比如定时器,非阻塞的网络支持,异步文件系统访问,子进程等实践接下来我们安装这个程序https://github.com/libuv/libuv在README.md里,我们就可以在Build Instructions找到安装方法下载地址$ tar -xvf libuv-v1.9.1.tar.gz$ sh autogen.sh+ l.

2020-12-25 14:57:11 2269

转载 Unix/Linux编程:终端(Terminal)与控制台(Console)的区别

一、终端Terminal1.1 终端的定义(1)什么是终端?终端就是处理计算机主机输入输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入,典型的终端包括显示器键盘套件,打印机打字机套件等。(2)终端的本质。其实根本上也就一句话,能接受输入,能显示输出,就这就够了,不管到了什么时代,终端始终扮演着人机接口的角色,所谓Terminal,即机器的边缘!只要能提供给计算机输入和输出功能,它就是终端,而与其所在的位置无关1.2 终端的分类(1) 本地终端用VGA连接主机和显示器

2020-12-25 13:58:57 2691

转载 Unix/Linux编程:守护进程

守护进程理论「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」。我们常见的 httpd、named、sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母。与普通进程相比它大概有如下特点:无需控制终端(不需要与用户交互)在后台运行生命周期比较长,一般是随系统启动和关闭守护进程是个特殊的孤儿进程,这种进程脱离终端。为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其

2020-12-24 21:25:09 177 2

转载 linux的systemd与init的区别

介绍init以前的Linux启动都是用init进程。启动服务:$ sudo /etc/init.d/apache2 start# 或者$ service apache2 start缺点:启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。systemd在较新的linux系统上,都使用systemd 取代了init,成为系统的第一个进程(PID 等于

2020-12-24 20:37:34 5757 2

转载 Unix/Linux编程:获取文件状态------stat()

在linux的shell解释器中,输入这样的命令stat + 文件名即可获取文件的属性。如:我们可以通过以下函数获取上面的值#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>struct stat { dev_t st_dev; 文件的设备编号 ino_t st_ino; 节点 mode_t st_mode; 文件的

2020-12-24 10:32:11 2448

转载 Unix/Linux编程:syslog进程与日志输出

守护进程: 在后台运行而且不和任何控制终端关联的进程syslogd守护进程Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行。 源自Berkeley的syslogd实现在启动时执行以下步骤(1) 读取配置文件 /etc/syslog.conf指定本守护进程可能收取的各种日志信息应该如何处理 这些消息可能被添加到一个文件(/dev/console文件是一个特例,它把消息写到控制台上),或者被写到指定用户的登录窗口(如果该用户已经登录到本守护进程所在.

2020-12-23 20:49:10 5509

转载 Netdata与centos7

Netdata是一个高度优化的Linux守护进程,它为Linux系统,应用程序,SNMP服务等提供实时的性能监测。Github: https://github.com/firehol/netdata/wiki/Installation (安装教程)开源中国:http://www.oschina.net/p/netdata/similar_projects (Netdata简介)Netdata GITHUB...

2020-12-23 19:45:48 630

转载 Linux C/C++编程:setsockopt、getsockopt

理论#include <sys/socket.h>/** 参数: sockfd: 指向一个打开的套接字描述符* level: 指定系统中解释选项的代码或者通用套接字,或者某个特定于协议的代码(比如IPV4,IPV6,TCP, SCTP)* optval为指向某个变量的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则把已获取的选项当前值放到*optval中。*optval的大小由最后一个参数决定 * 返回值: 成功0,出错

2020-12-23 14:39:02 1594

转载 C/C++编程:线程私有空间封装

基础linux多线程之线程私有存储空间1、Posix 标准下 “动态 TLS 模型” 使用举例:#include <stdlib.h>#include <stdio.h>#include <pthread.h>static pthread_key_t key;// 每个线程退出时回调此函数来释放线程局部变量的动态分配的内存static void destructor(void *arg){ free(arg); printf("des

2020-12-21 15:33:49 315

转载 C/C++编程:0长度数组与变长数组

零长度数组概念众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下struct Packet{ int state; int len; char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持};首先对 0长度数组, 也叫柔性数组 做一个解释 :用途 : 长度为0的数组的主要用途是为了满足

2020-12-21 13:49:27 3583

转载 C/C++编程: Anonymous unions(匿名联合)

在 C++ 我们可以选择使联合(union)匿名。如果我们将一个 union 包括在一个结构(structure)的定义中,并且不赋予它对象(object)名称 (就是跟在花括号{}后面的名字),这个union 就是匿名的。这种情况下我们可以直接使用 union 中元素的名字来访问该元素,而不需要再在前面加 union 对象的名称。在下面的例子中,我们可以看到这两种表达方式在使用上的区别:以上两种定义的唯一区别在于左边的定义中我们给了 union 一个名字 price ,而在右边的定义中我们没给。

2020-12-21 13:02:01 2710 2

转载 C/C++编程:#pragma pack的使用

在没有外部干预的情况下,编译器会根据操作系统及编译环境来自动设定结构体的内存对齐的默认字节,但是在实际开发中,有时候考虑到实际内存,会有将结构体设置为1字节对齐(不对齐)的需求,这个时候就要借助C/C编译指令#pragma pack(),这个指令也是非常复杂的,这里只总结两种常用的#pragma pack(n)与 #pragma pack()理论#pragma pack(n) //作用:C编译器将对以下的结构体按照n个字节对齐。/* 定义结构体类型*/#pragma pack() /.

2020-12-21 11:55:18 923

转载 C/C++编程: __attribute__((aligned(n)))、__attribute__((packed))、__alignof

__attribute__是GUN C中极具特设的一大机制,可以用来设置函数属性(Function Attribute)变量属性(Variable Attribute)类型属性(Type Attribute)这里我们主要阐述用__attribute__((aligned(n)))和__attribute__((packed))两个指令对结构体进行属性设置__attribute__与结构体理论__attribute__((aligned(n))) //采用n字节对齐__attribut

2020-12-21 11:54:24 6995 1

转载 C/C++编程:结构体默认对齐方式

什么是内存对齐还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。#include<stdio.h>struct{ int x; char y;}s;int main(){ printf("%d\n",sizeof(int)); // 4 printf("%d\n",

2020-12-21 11:29:56 3942

onvif摄像头对接鉴权

对应文章: https://blog.csdn.net/zhizhengguan/article/details/109325688

2022-08-11

空空如也

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

TA关注的人

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