自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 protobuf的安装和使用

protobuf的安装sudo apt-get install autoconf automake libtool curl make g++ unzipgit clone https://github.com/google/protobuf.gitcd protobufgit submodule update --init --recursive./autogen.sh./configuremakemake checksudo make installsudo ldconfig

2021-09-10 17:20:11 233

原创 【demo】利用protobuf读取配置文件

说明这是一个利用protobuf读取配置文件的 demo。利用protobuf读写二进制流的例子在网上有很多,但是读写配置文件我觉得也是一个很大的应用空间。proto文件ken@ubuntu:~/test/protobuf/test_pf$ cat addressbook.protosyntax = "proto2";package tutorial;message Person { required string name = 1; required int32 id = 2;

2021-09-10 17:18:41 741

原创 ubuntu命令行模式启动

文件:vi /etc/default/grub修改:GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”=》GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash 3”生效:sudo update-grub 重启。

2021-04-28 10:52:39 388

原创 gdb加载调试符号(符号表)

抽取调试符号:objcopy --only-keep-debug DEBUG版可执行文件 符号表文件名.symbol在gdb中加载符号表:gdb --symbol=符号表文件名.symbol -exec=RELEASE版可执行文件

2021-04-19 17:57:04 10093

原创 配置Linux自动生成core文件

编辑/etc/security/limits.conf文件,在末尾添加 soft core unlimited修改内核转储文件名格式:/proc/sys/kernel/core_pattern文件。echo -e "/root/corefile/core-%e-%s-%p-%t" > /proc/sys/kernel/core_pattern其中,%e表示进程名,%s表示进程崩溃时收到的信号,%p带白哦进程ID,%t表示时间戳...

2021-04-19 17:54:00 299

原创 ldconfig用法

ldconfig是设置系统的动态库路径的,设置完成后,新的shell窗口也能起作用。ldconfig是系统动态库连接管理工具,使用ldconfig的时候需要注意如下几点:如果把动态库文件复制到/usr/lib或者/lib,再赋值完成以后,需要执行一下ldconfig命令,否则不会起效果如果不复制到/usr/lib或者/lib中,而是其他自定义的路径,那么就需要把路径添加到/etc/ld.so.conf中,修改完成后需要执行ldconfig...

2021-04-19 17:45:45 6479

原创 计时器类

using namespace std::chrono;class TimerBase {public: //init TimerBase TimerBase() : m_start(system_clock::time_point::min()) {} //clear timer void clear() { m_start = system_clock::time_point::min(); } bool IsSta

2021-04-19 10:47:06 110

原创 g++自带内存检查工具

在编译时,加入编译选项 -fsanitize=address,再重新编译并执行程序,检查结果会在程序退出之后打印在标准输出中

2021-04-19 09:13:14 379

原创 gdb命令补遗

set args 参数1 参数2 -> 设置启动参数=======================================rb -> 使用正则表达式来设置断点b +5 -> 在当前行的后第5行设置断点tb -> 设置临时断点,只命中一次就删除========================================enable count 次数 断点号 -> 启用某个断点一定次数ignore 断点号 次数 -> 忽略某断点

2021-04-17 11:47:06 67

原创 O2优化后,程序freez了(变量的读取过程被优化,使用volatile可解决)

一、现象先上源码:#include <thread>#include <iostream>int main() { int a = 0; int flag = 0; std::thread t1([&]() { while (flag != 1); int b = a; std::cout << "b = " &l

2021-03-11 16:13:39 455 1

原创 linux查看当前CPU调度的线程

在shell上复制并粘贴服下命令while true; do cat /proc/sched_debug | grep "curr->pid"; sleep 1; done使用场景:粗略判断是哪个线程占用CPU比较频繁,配合GDB可以找到问题进程中的某个线程,缩小问题的搜索范围。缺点:只能1秒一输出,精度不够。...

2021-01-11 15:38:03 620

原创 DLT 网关功能配置

DLT 网关功能使用dlt的gateway功能,要先明确两个概念:gateway端和passive端。简而言之,gateway端就是开启gateway功能,能够把passive端的log传输给dlt-viewer的dlt-daemon。而passive端则是产生dlt log,并不直接与某个dlt-viewer相连的dlt-daemon。为了调查dlt的gateway功能,我建立了两个虚拟机,一个作为passive端,一个作为gateway端。再用pc作为dlt-viewer端来接收passive端

2020-11-17 10:35:54 2313 2

原创 DLT 本地log功能配置

dlt本地log需要指定APP NAME和CONTEX NAME才能保存对应的log。1、操作过程:在dlt.conf中打开本地log的配置项:然后再在OfflineLogstorageDirPath路径下创建本地log规则文件:dlt_logstorage.conf在文件中写入过滤规则:再启动dlt-daemon -c /etc/dlt.conf -d,这样就可以让dlt针对LOG 这个app中以TEST为名的ctx的log(log等级大于DLT_LOG_WARN)都保存在/opt/tes

2020-11-17 10:26:30 5109

原创 屏蔽gdb的回车提示

set pagination off // 不要出现 Type to continue 的提示信息

2020-10-27 19:45:26 572

原创 《夜航船》趣事

“小生愚见,那打虎的义士实不该推却州官的酬谢啊。”烛光把士子的身影映在船舱的席子上,而舱的另一边窝着一个小和尚,正听得入神。忽一阵江风吹过,使得烛火阵阵摇晃,小和尚也似禁不住凉风一般,蜷缩的双腿向胸腹靠得更近了些。“阿弥陀佛,为乡民除害又不受褒奖,小僧不知那壮士有何不妥。”,小和尚一边说着,一边凝望着对面的士子,仿佛能从他的脸上看出无上菩提来。“小师傅可曾听说过子伯救鲁国人的事?”士子答。“阿弥陀佛,小僧学浅。”“哈哈哈哈,不妨。”士子便将子贡救鲁人的事讲了一遍,不过都安在了子伯的身上。“阿弥陀佛,原

2020-10-01 06:21:07 2173

原创 【strace挺神奇】跟踪fd的生老病死

遇到一个文件描述符耗尽的问题。不知道在哪leak的。同事告诉我用一下strace。命令:strace -fp 617 #617是进程号,也可以用strace命令起进程strace打印出的log:从上图的高亮部分可以看出,代码里用socket系统调用申请了一个fd之后,试图connect一个本地socket,但是由于server端没有上线(通信文件都没创建),导致connect失败了。失败之后,代码并没有close这个fd(如果close的话,在connect后面会打出来)。导致

2020-09-23 16:28:53 544

原创 C++11 带位宽和填充的输出

头文件:#include <iomanip>设置填充:cout.fill('-');//一次调用永久生效设置宽度:cout<<std::setw(2)<<0x1<<std::endl;//每次cout都要调用一次设置16进制:std::cout<<std::hex<<0xbb<<std::endl;//一次调用,永久生效...

2020-08-22 11:40:51 534

原创 C++11 按行读取文件的迭代器

定义:#include <iostream>#include <fstream>#include <string>#include <cstddef>//ptrdiff_t 需要该头文件using namespace std;class ifs_line_reader{ class iterator { typedef ptrdiff_t different_type;//定义++

2020-07-31 16:29:41 508

原创 C++11 打印系统时间(精确到毫秒)和时间戳(毫秒单位)

把下面这两个函数加入代码中:std::time_t getTimeStamp(){ std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); auto tmp=std::chron

2020-06-05 11:48:41 12005

原创 C++11打印时间问题

#include <iostream>#include <chrono>int main(){std::chrono::steady_clock::time_point t1 = std::chrono::system_clock::now();std::cout << "Hello World\n";std::chrono::steady_clock::time_point t2 = std::chrono:: system_clock::now();s

2020-06-04 20:31:18 676

原创 使用cmake做工程构建时,有关install的一些小技巧

cmake自带变量CMAKE_INSTALL_PREFIX不能随着subdir传递下去,必须要在最外层指定由我们自定义的变量可以随着subdir传递下去拷贝目录用如下cmake命令:INSTALL(DIRECTORY ${WORK_PATH}/auto_part_tool DESTINATION "usr/bin" DIRECTORY...

2020-04-16 14:50:23 1083

原创 重定向到文件时的缓冲问题

在定位一个问题的时候发现“用命令行重定向程序的输出log到一个文件”的时候,文件里没有任何打印。之前在定位同一个程序的“非预期退出”问题时明明有打印的。调查后发现这是文件缓冲带来的影响。这种问题在以前的才坑历程中遇到过,只是忘记了,现在再次回想起来,于是就记录一下。标准输出是有缓冲的(标准错误没有),缓冲分为三种:无缓冲行缓冲(遇到\n才输出到文件)全缓冲(程序退出才输出到文件)...

2020-04-09 09:57:44 931

原创 readn代码实现

size_t readn(int fd, void *buffer, size_t length) { size_t count; ssize_t nread; char *ptr; ptr = buffer; count = length; while (count > 0) { nread = read(fd, ptr, ...

2019-09-23 09:34:24 125

原创 sscanf高级用法

理解了%[^|]|这个模式就基本能解析复杂字符串了。这个模式是%s的一个正则表达式方向的进化,本意也是要取字符串,但是是有选择的取。如何选择,就写在[]中。其中的^表示“不取”,不取哪些模式就写在^的后面。例子中的[^\]就表示不取|,取到|就停止了,最后一个|则对应源串中的|。整体来看,%[^|]|就表示取到|为止(不取这个|)然后跳过|。另外还有更多的取%s的进化,比如%[0-9](只...

2019-08-09 09:36:08 302

原创 C语言宏杂技

使用宏杂技,心里一定要默念:“这是代码级的字符串替换”。换言之,宏只是替换进代码里去,就像直接写进去一样,替换完再参与编译。1.#转换符。#var 表示取var的变量名(即 “var”),而不是取它的值。例子(打印变量名和变量值)://#var表示变量名#define debug_value(var) printf("%s:%d, ", #var, var)使用:#include ...

2019-08-02 11:25:12 125

原创 vim设置

set numbersyntax onset showmodeset showcmdset encoding=utf-8set t_Co=256filetype indent onset autoindentset tabstop=2set shiftwidth=4set expandtabset softtabstop=4#设置行号为相对行号set relativenu...

2019-07-30 22:15:39 131 1

原创 创建守护进程

守护进程的特点:常驻内存会话组组长进程组组长无控制终端#include <unistd.h>#include <iostream>#include <fstream>#include <fcntl.h>std::ofstream fs;void handler(int sig) //信号处理函数参数为int ,返回值为vo...

2019-07-29 21:21:29 90

原创 libevent使用

客户端代码,使用libevent+单线程.libevent,我个人理解,它就是给epoll封装了一下,搞了个时间注册的机制,说到底还是单线程。我觉得,起 数量与CPU核心数量相匹配的 线程来处理计算业务,然后把IO需求都扔个一个单独的线程去处理,这样的效率会更高。#include <stdlib.h>#include <stdio.h>#include <sy...

2019-07-25 02:00:19 132

原创 socket编程ipv6版本

服务端(server.c)#include <stdlib.h>#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <string.h>#include <ctype.h...

2019-07-22 10:20:41 790

原创 TCP的TIME_WAIT状态和端口复用

TCP在四次挥手时的值得关注的几个状态:主动关闭SOCK的一方会处于FIN_WAIT2状态,即主动关闭方的半连接状态。被动关闭方给主动关闭方回复了ACK之后会进入CLOSE_WAIT状态,此时被动方没有close socket主动方给被动方回复了ACK之后会进入TIME_WAIT状态,等待2MSL的时间(在linux上是1分钟左右),之后再结束TIME_WAIT状态。这样做是为了确保被动方...

2019-07-21 23:03:36 2126

原创 epoll使用

头文件#include <sys/epoll.h>创建 int epoll_create(int size)size: 该值是给内核的一个建议,建议内核给该epfd分配size这么多节点。只是个建议,内核可以动态增大epfd中的容量。返回值: 返回的文件描述符指向一个红黑树的根节点操作文件描述符epoll_ctl(int epfd, int op,...

2019-07-21 22:51:26 117

原创 第三方库管理脚本(可实现把程序依赖的库一键安装到新环境上,在程序中需要指定rpath,其路径与脚本中RPATH_PREFIX要一致)

[root@localhost195-46 kernel]# cat setup_env.sh #!/bin/bashRPATH_PREFIX=/usr/smias/libINCLUDE_PREFIX=/usr/smias/include################### mySQL lib ############################MYSQL_PREFIX_PA...

2019-07-21 21:49:03 205

空空如也

空空如也

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

TA关注的人

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