C++
文章平均质量分 71
n大橘为重n
/* 一个有点小情怀的码农 */
展开
-
如何使用gdb调试多线程死锁问题,并定位触发死锁的线程
gdb调试多线程、多线程死锁问题原创 2022-06-08 15:44:39 · 1955 阅读 · 1 评论 -
Gflags开源库使用--解析命令行参数
一、简介gflags是Google的一个命令行参数处理的开源库,使用C++开发,具备Python接口,可以替代getopt。gflags支持从环境变量、配置文件读取参数。gflags使用起来比getopt方便,但是不支持参数缩写(例如getopt支持--list缩写成-l,gflags不支持)。gflags不支持列表,用户可通过借助string参数实现:可看作以逗号分隔的参数列表:DEFINE_string(languages, “english, french, german, chi.转载 2021-03-27 01:45:52 · 1825 阅读 · 0 评论 -
C++宏定义中#和##的用法
前段时间很到了宏定义中的新知识:#与##,感觉打开了新天地的大门。首先来介绍一下这两种功能:##的用法是负责将其后面的东西转化为字符串,比如:#define TO_STRING(str) #strint main(){ cout << TO_STRING(this is a string) << endl; return 0;}这段代码中,TO_STRING宏就会将括号中的内容转化为字符串,生成"this is a string",然后由co...原创 2021-03-27 01:09:49 · 6397 阅读 · 1 评论 -
生成独立的gcc调试文件及利用调试文件调试core文件
1、生成独立的gcc调试文件编译调试信息:gcc -g -o main main.c分离调试信息:objcopy--only-keep-debug main main.debug或者cp main main.debug strip--only-keep-debug main.debug从原始文件中剥离调试信息:objcopy --strip-debug main或者strip --strip-debug --strip-unneeded main通过..原创 2021-03-18 22:41:51 · 3944 阅读 · 0 评论 -
ProtoBuf 语法简介
一、简介。protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式,等等。其特点是不限语言、不限平台、扩展性强,就像XML一样。与XML相比,protobuf有以下特点:1、操作更简单。例如,我们要定义一个个人信息的结构,其中包括名称和邮箱地址两个部分。用XML定义如下:<person><name>John Doe</name><email>jdoe@example.com&...原创 2021-02-20 20:18:28 · 11103 阅读 · 1 评论 -
ProtoBuf 官方文档(二)- 语法指引(proto2)
翻译查阅外网资料过程中遇到的比较优秀的文章和资料,一是作为技术参考以便日后查阅,二是训练英文能力。此文翻译自 Protocol Buffers 官方文档 Language Guide 部分翻译为意译,不会照本宣科的字字对照翻译以下为原文内容翻译语法指引(proto2)本指南介绍如何使用 protocol buffer 语言来构造 protocol buffer 数据,包括 .proto 文件语法以及如何从 .proto 文件生成数据访问类。它涵盖了 protocol buffer 语言.转载 2021-02-20 19:40:05 · 1584 阅读 · 0 评论 -
C++11新增alignas关键字作用
alignas关键字用来设置内存中对齐方式,最小是8字节对齐,可以是16,32,64,128等。下面先写个alignas对齐的实际代码,等下再来说为什么会这样。#include <iostream>using namespace std; struct struct_Test1{ char c; int i; double d;}; struct alignas(8) struct_Test2{ char c; int i; double d;};转载 2021-02-20 11:36:26 · 2865 阅读 · 1 评论 -
C++11新特性:参数绑定——std::bind
概述std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作。函数原型std::bind函数有两种函数原型,定义如下:template< cl.转载 2020-10-22 22:08:18 · 894 阅读 · 0 评论 -
C++11之Lambda表达式
Lambda表达式C++11的一大特性就是引入了Lambda表达式,并在后续的C++14进行了加强。利用Lambda表达式,可以方便定义和创建匿名函数。一个Lambda表达式表示一个可调用单元,我们可以将其理解为一个未命名的内联函数。Lambda语法定义[capture list] (paramters list) mutable exception-> return type{function body}其中——capture list,捕获外部变量列表; paramte转载 2020-10-22 19:48:17 · 732 阅读 · 0 评论 -
关于typedef void (*sighandler_t)(int)的理解
最近,在学习Linux信号量时,看到signal函数中typedef的一个用法,觉得很有意思。于是就拿出来说道说道。 它定义了一个类型sighandler_t,表示指向返回值为void型(参数为int型)的函数(的)指针。它可以用来声明一个或多个函数指针。 sighandler_t sig1, sig2; 这个声明等价于下面这种晦涩难懂的写法: void (*sig1)(int), (*sig2)(int); 1. 关于typed...转载 2020-10-22 19:45:19 · 1143 阅读 · 1 评论 -
C++17之『折叠表达式』
C++11 提供了可变模板参数包, 使函数可以接受任意数量的参数. 但在 C++11中展开参数包稍显麻烦, 而 C++17 的折叠表达式使得展开参数包变得容易,其基本语法是使用(...)的语法形式进行展开.支持的操作符折叠表达式支持 32 个操作符:+,-,*,/,%,^,&,|,=,<,>,<<,>>,+=,-=,*=,/=,%=,^=,&=,|=,<<=,>>=,==,...转载 2020-10-22 17:56:00 · 706 阅读 · 0 评论 -
SignalHandler 处理系统信号
在服务器端后台开发中,常常需要写 daemon 程序在后台默默执行一些任务。除了正常的逻辑之外,还需要考虑处理异常退出时怎么办。这时可以用到 signal 这个函数来注册异常信号的回调函数。示例#include <iostream>#include <csignal>#include <time.h>#include <stdlib.h>#include <unistd.h>using namespace std;void转载 2020-10-20 11:22:18 · 3675 阅读 · 0 评论 -
BOOST 之filesystem, path
目录[-]使用 boost::filesystem 的第一个程序 清单 1. 用于确定某个文件的类型是否为 Directory 的代码 了解 Boost path 对象 清单 2. 创建 Boost path 对象的方法 清单 3. 使用本机格式初始化 path 清单 4. 使用可移植格式初始化 path path 成员函数概述 清单 5. 使用 path::iterator(begin 和 end 接口) 清单 6. 路径字符串的串联 错误处理 清单 7. Boost 中的错误处理转载 2020-10-19 17:25:03 · 3066 阅读 · 0 评论 -
prctl函数的应用
intprctl( intoption,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5 )这个系统调用指令是为进程制定而设计的,明确的选择取决于option:PR_GET_PDEATHSIG :返回处理器信号;PR_SET_PDEATHSIG :arg2作为处理器信号pdeath被输入,正如其名,如果父进程不能再用,进程接受这个信号。PR_GET_DUMPABLE :返回处理器标...转载 2020-10-14 16:58:23 · 650 阅读 · 0 评论 -
C++ 数值最大最小标识符一网打尽,INT_MIN/ INT_MAX/LONG_MIN/LONG_MAX 等等
Constant Meaning Value CHAR_BIT Number of bits in the smallest variable that is not a bit field. 8 SCHAR_MIN Minimum value for a variable of typesigned char. -128 SCHAR_MAX Maximum value for a variable of typesigned char. 12..转载 2020-08-24 14:58:41 · 592 阅读 · 0 评论 -
C++11模版元编程
1.概述 模版元编程(template metaprogram)是C++中最复杂也是威力最强大的编程范式,它是一种可以创建和操纵程序的程序。模版元编程完全不同于普通的运行期程序,它很独特,因为模版元程序的执行完全是在编译期,并且模版元程序操纵的数据不能是运行时变量,只能是编译期常量,不可修改,另外它用到的语法元素也是相当有限,不能使用运行期的一些语法,比如if-else,for等语句都不能用。因此,模版元编程需要很多技巧,常常需要类型重定义、枚举常量、继承、模板偏特化等方法来配合,因此编写模版元编程比转载 2020-08-12 23:08:01 · 1114 阅读 · 0 评论 -
C/C++在程序中获取CPUID+网卡Mac的几种方法
直接上代码。命令行获取到结果之后需要将16值字符串转换成整数:int tolower(int c){ if (c >= 'A' && c <= 'Z') { return c + 'a' - 'A'; } else { return c; }}unsigned long htoul(char s[]){ int i; unsigned long n = 0; if (s[0] == '0' && (s[1]=='x' ||原创 2020-07-31 21:02:14 · 1861 阅读 · 1 评论 -
网络编程——C++实现socket通信(TCP)高并发之epoll模式
相关链接:TCP连接与释放、网络编程——C++实现socket通信(TCP)相关函数:服务端:socket()bind()listen()epoll_create() 高并发poll模式epoll_ctl()epoll_wait()accept()read() 或 recv()等write() 或 send()等close()客户端:socket()connect()write() 或 send()等read() 或 recv()等close()着重说明下epol原创 2020-06-29 14:15:49 · 6103 阅读 · 2 评论 -
epoll中epoll_data_t 中fd和ptr的用法
文章是网上内容总结,为了自己下次好找,所以写到自己博客里边了。typedef union epoll_data {void *ptr;int fd;__uint32_t u32;__uint64_t u64;} epoll_data_t;struct epoll_event {__uint32_t events; /* Epoll events /epoll_data_t data; / User data variable */};epoll_data中fd存放文件描述符,所以我们一转载 2020-06-26 20:36:12 · 2073 阅读 · 0 评论 -
epoll详解及优点
epoll详解更详细的讲解-->【Linux学习】epoll详解什么是epoll? epoll是为处理大批量句柄而作了改进的poll, 是性能最好的多路I/O就绪通知方法; 只有三个系统调用: epoll_create, epoll_ctl, epoll_wait; epoll_ctl - epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型; epoll的工作原理 epoll同样只告知那些就绪的文件描转载 2020-06-26 18:22:15 · 2370 阅读 · 0 评论 -
网络编程——C++实现socket通信(TCP)高并发之poll模式
相关链接:TCP连接与释放、网络编程——C++实现socket通信(TCP)相关函数:服务端:socket()bind()listen()poll() 高并发poll模式accept()read() 或 recv()等write() 或 send()等close()客户端:socket()connect()write() 或 send()等read() 或 recv()等close()着重说明下poll函数用法。跟select功能类似,可以设置的同时监听上限会更多,原创 2020-06-19 16:43:49 · 1537 阅读 · 0 评论 -
网络编程——C++实现socket通信(TCP)高并发之select模式
相关链接:TCP连接与释放、网络编程——C++实现socket通信(TCP)相关函数:服务端:socket()bind()listen()FD_ZERO()等辅助函数select() 高并发select模式accept()read() 或 recv()等write() 或 send()等close()客户端:socket()connect()write() 或 send()等read() 或 recv()等close()着重说明下select函数及辅助函数用法说明。原创 2020-06-18 11:35:22 · 3306 阅读 · 1 评论 -
网络编程——C++实现socket通信(TCP)
相关链接:TCP连接与释放相关函数:服务端:socket()bind()listen()accept()read()write()close()客户端:socket()connect()write()read()close()注意:每当服务端连接断开后,废话不多说,上源码!服务端TCP_Server.cpp#include <stdio.h>#include <sys/types.h>#include <sys/socket.h原创 2020-06-10 16:09:23 · 13459 阅读 · 3 评论 -
函数模板和类模板(+代码实现)
一、函数模板1.函数模板建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟类型来代表这个通用函数来代表。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中虚拟的类型,从而实现不同函数的功能。作用:功能相同而数据类型不同的一些函数,不必一一定义各个函数,通过定义一个可以对任何类型变量操作的模板函数,在调用函数时,系统会根据实参的类型,取代函数模板中的类型参数,得到具体的函数。2、函数模板的一般形式t原创 2020-05-12 19:54:47 · 642 阅读 · 0 评论 -
C++自定义String的实现
这个在面试或笔试的时候常问到或考到。已知类String的原型为:class String{public: String(const char *str = NULL);// 普通构造函数 String(const String &other);// 拷贝构造函数 ~String(void);// 析构函数 String & operator = (...转载 2020-04-24 16:30:42 · 2115 阅读 · 0 评论 -
C++的拷贝构造和移动构造
一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都没有默认值,则此构造函数是拷贝构造函数。(《C++Primer,第五版》)class Foo{public : Foo(); Foo(const Foo&); //拷贝构造函数 Foo& operator=(const Foo&); //拷贝赋值运算符};...转载 2020-04-24 16:24:25 · 1406 阅读 · 0 评论 -
C/C++知识点 —— (1)
C/C++知识点 —— const作用const的指针与引用使用作用修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;修饰成员函数,说明该成员函数内不能修改成员变...原创 2020-04-22 14:54:42 · 213 阅读 · 0 评论 -
C++后端开发技术栈
作为一名C++程序员,做后端开发,想在互联网开发热潮中有一席之地,就需要了解未来的工作所需要用到的一些技术栈。没有学习的意识和有学习的意识结果是不一样的,有学习的意识但是犯懒偷懒跟有学习意识并能时刻保持学习状态又是不一样的。先列一下目前我能想到的:1. c++语言,面向对象, stl库等2. linux操作系统,各种调试器(如gdb)和编译器工具(makefile,gradle)3...原创 2020-04-16 19:53:52 · 5161 阅读 · 7 评论 -
在x86平台制作龙芯版debian 10系统(mips64el)+配置精简系统
一、制作mips64el架构的系统OS:ubuntu 16.04使用debootstrap制作根文件系统会分成两个阶段。第一阶段是,使用debootstrap命令来下载软件包。 第二阶段是安装软件包。安装debootstap 等相关工具$ sudo apt install binfmt-support qemu qemu-user-static debootstrap使用d...原创 2020-04-01 20:47:11 · 5900 阅读 · 1 评论 -
BF算法(暴力算法)--模式匹配算法
模式匹配算法:是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。用途:搜索引擎、拼写检查、语言翻译、数据压缩等。BF算法:BF算法即暴力(Brute Force)算法,是普通的模式匹配算法。BF算法的思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等...转载 2020-02-18 15:42:24 · 7138 阅读 · 0 评论 -
循环队列的操作
不是只有排序,二叉树才叫数据结构,面试栽在基本的数组和队列,链表,栈的有的是!!!本文对循环队列的重要操作作出总结。注:为了避免队列空和满两个状态混淆,采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。这也是大多数教材的做法。1) 循环队列初始化:front=rear=0;2)入队操作:rear=(rear+1)%size;3)出队操作:front=(fro...转载 2020-02-18 13:43:29 · 693 阅读 · 0 评论 -
Linux进程间通信(IPC)——生成唯一键时IPC_PRIVATE和ftok的比较
在linux中,可以使用IPC对象来进行进程间通信。IPC对象存在于内核中,多进程可以操作同一个IPC对象。每个IPC对象都有一个唯一的编号,该编号是由系统分配的。那么不同的进程如何知道这个编号,进而通过它进行通信呢?下面以共享内存为例,进行分析。方法一:通过ftok函数,产生相同的键值。假设,进程p1创建了共享内存。可以在创建时,调用ftok函数,得到一个key值,调用shmget函...转载 2020-01-11 17:17:31 · 842 阅读 · 0 评论 -
Linux环境下C++访问web服务——使用libcurl库调用http接口发送解析json数据
一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符串。所以我们主要做的就是:连接远程url、找到接口,将基本类型的数据封装成json数据传入接口,然后获取返回值,并解析返回的json数据。 这里需要用到的库就有url库、json库,大致了解了,...原创 2019-12-06 16:57:43 · 1639 阅读 · 0 评论 -
C/C++ 字符串比较——区分大小写和不区分大小写
一、区分大小写一般我们常用的字符串比较函数都是区分大小写的。我们这里只介绍strcmp函数,在windows和linux下函数名和用法都一样。原型:extern int strcmp(const void *s1, const void *s2);功能:用于比较两个字符串并根据比较结果返回整数。用法:基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str...原创 2019-10-28 14:31:35 · 21030 阅读 · 2 评论 -
应用单例启动实现(采用文件锁方式)
应用单例启动(采用文件锁方式)有时候我们的应用程序在系统中可能只允许启动一个(比如服务程序),怎么实现这种需求呢?思想:我们可以采用文件锁的方式,因为通过文件锁,可以保证同一时刻只有一个应用能占得文件资源,获取锁成功的可以执行,如果被其他进程占用时就不能执行。准备:有了思路后,剩下就是怎么操作设置文件锁了。用到网络锁,就不可避免要使用fcntl函数。fcntl函数,调用可以用来对已...原创 2019-10-24 17:44:55 · 440 阅读 · 0 评论 -
Linux:解决应用程序/动态库中与加载的其他动态库的函数 重名问题
Linux:解决应用程序/动态库中与加载的其他动态库的函数 重名问题问题 :今天客户提出来一个大问题,Linux版本的一段程序,显示正常的pdf在识别的时候,程序崩了,这个不应该啊。就算pdf是坏的,那也应该有错误码,而不应该崩掉啊。在复现的过程中,gdb调试发现,在我们的动态库A.so中有个接口叫F_Recg(),我们调用的底层还有个用的别人提供的动态库B.so,其中有个函数也叫F_Re...原创 2019-10-18 17:28:35 · 1567 阅读 · 0 评论 -
在RetHat5.4中报错 cannot restore segment prot after reloc: Permission denied
问题: ./test_new: error while loading shared libraries: libWT-TH-ImageOCR.so: cannot open shared object file: No such file or directory解决: 输入如下命令:sudo vim /etc/ld.so.confsudo ldconfig第一个命...原创 2019-05-31 19:37:05 · 221 阅读 · 0 评论 -
linux system函数是否执行成功判断方法
首先我们看一个例子: status = system("./test.sh");1、先统一两个说法:(1)system返回值:指调用system函数后的返回值,比如上例中status为system返回值(2)shell返回值:指system所调用的shell命令的返回值,比如上例中,test.sh中返回的值为shell返回值。2、如何正确判断test.sh是否正确执行?...转载 2019-07-08 15:57:56 · 2652 阅读 · 0 评论 -
C语言中open失败,错误码24,错误描述:打开文件过多 Too many open files。句柄泄露问题
最近在一个Linux项目的反馈中,有一个open失败的问题。场景是客户在识别很多次文件并导出时,发生了错误,根据我们的错误码定位到问题是出在一个open的地方,打开文件的时候失败,造成了不能正常生成文件,最后导致的错误。 定位到问题后,根据open联想到是不是有open的文件没有关闭,导致句柄泄露的。因为用命令ulimit -n可以看到,在系统中默认的一...原创 2019-07-10 10:21:59 · 5034 阅读 · 0 评论 -
undefined symbol问题的查找、定位与解决方法
今天被客户测出来一个问题:程序执行中报错,报错内容如下XXXX:symbol lookup error:/home/....../libpdfium.so:undefined symbol:CRYPT_MD5Generate报错分析: 这个问题表明是符号未定义的问题,而且直接定位于产品链接的第三方动态库libpdfium.so中,于是从libpdfium.so中着手。...原创 2019-07-16 14:29:54 · 191471 阅读 · 21 评论