自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

staticnetwind的专栏

Linux开发的学习之旅

  • 博客(56)
  • 资源 (3)
  • 收藏
  • 关注

原创 Linux下使用libpcap实现抓包

1. 背景学习PF_RING的过程中,发现对libpcap进行重载。所以回到基础再次学习了一下pcap抓包原理。2. 相关知识2.1 原理这篇文章写的就非常清晰《libpcap实现机制及接口函数》这里实现的包捕获机制是在数据链路层增加一个旁路处理,并不干扰系统自身的网路协议栈的处理,对发送和接收的数据包通过Linux内核做过滤和缓冲处理,最后直接传递给上层应用程序。因此libpcap在捕获到达网卡的数据包后绕开了传统linux协议栈处理,直接使用链路层PF_PACKET协议族原始套接字方式向用户

2021-10-11 21:07:50 22

原创 Linux下mktime接口耗时测试

1、背景项目中使用发现mktime开销较大,使用性能测试工具测试一下;2、接口说明主要用于所指向的结构转换为自 1970 年1月1日以来持续时间的秒数,发生错误时返回-1。SYNOPSIS top #include <time.h> time_t mktime(struct tm *timeptr);DESCRIPTION The functionality described on this reference page i

2021-09-26 20:56:45 1602

原创 Linux下用户态mktime实现参考

1、背景项目中使用发现mktime开销较大,使用性能测试工具测试一下;2、接口说明主要用于所指向的结构转换为自 1970 年1月1日以来持续时间的秒数,发生错误时返回-1。SYNOPSIS top #include <time.h> time_t mktime(struct tm *timeptr);DESCRIPTION The functionality described on this reference page i

2021-09-11 11:07:17 1162

原创 Linux下使用pthread实现进程锁的注意事项

1. 背景最近通过共享内存mmap实现多进程的数据共享,使用PTHREAD_PROCESS_SHARED时写错了,导致进程锁不起作用。2. 接口接口说明如下,用法与多线程的互斥锁类似,但需要额外设置一下PTHREAD_PROCESS_SHAREDSYNOPSIS #include <pthread.h> int pthread_mutexattr_getpshared( const pthread_m

2021-05-22 17:46:46 62

原创 Linux下c语言快速实现web服务器

1. 前言        最近整理了整理,把之前好玩的东西翻一下,这期就到了http了。        如何快速写一个http服务器?方法当然五花八门了,python、go几行就能实现出来了,那么c\c++如何实现呢?2. 相关接口libevent内置了http相关的处理方法(之前早期版本会有一些不稳定,现在event2比较靠谱了),同时支持

2020-10-07 18:04:42 370

原创 Linux下使用hiredis库与libevent实现异步接口的I/O复用

1 前言    之前的一篇文章《Linux下使用hiredis库实现优先级队列》,用的同步的接口实践;    后来遇到一个场景,同时需要处理Redis订阅的消息,又需要处理其他网络socket操作、定时器操作,当然多线程是一个思路,本文尝试从Reactive模式上解决这个问题,即用redis的异步接口,与libevent进行对接。    其实最终目的就是就是Redis接入到这篇文章编

2020-08-02 13:59:57 548

原创 Linux下使用libevent实践文件零拷贝操作

1. 前言这两天又翻了翻libevent代码,发现文件操作中内部带有sendfile、mmap相关代码。又找了网上相关使用说明,资料都比较少,所以实践出真知,搞一搞。2. 介绍2.1 初探零拷贝mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系[2]。#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int

2020-07-18 15:27:33 266

原创 Linux下进程级令牌桶的一种实现方法

1、前言最近看了

2020-07-11 23:00:23 269

原创 Linux下快速解析nf_conntrack

1. 背景回顾了项目需求是系统的统计tcp连接数;于是想到了 nf_conntrack 这个Linux内核提供的记录和跟踪连接状态的功能;然后写了个程序解析 /proc/net/nf_conntrack这个映射文件,后来悲剧就发生了,当conntrack表记录变增加到1w以上之后,解析速度急速下降,到了10w规模后,解析耗时几十秒都不能完成,,,终于后来翻到了netfilter的老巢,发现了解决方法:libnml、libnetfilter_conntrack2. 使用核心原理是通过netlink

2020-07-08 22:00:31 500

原创 Linux下使用benchmark进行性能测试

1、背景继《Linux下使用gtest对接口进行单元测试》一文之后,Google还有一个实用工具:benchmark;他是基于c++11的性能测试工具,写法方面跟gtest十分类似2、实践实践这块正好使用bm这个工具,正好结合测试了一下leveldb的读写性能,课题背景是调研leveldb单条写入的测试,后续还继续对比redis、sqlite相关性能;2.1 实现首先构造一个类bm_level,与gtest类似,实现setup、teardown方法。#include <list>#

2020-07-07 21:48:34 2653

原创 c语言数组洗牌的实现

1.前言        测试数据中,需要用到随机数据,同时要求数据不能重复。所以最终想到了洗牌的方式来生成测试数据,也就是大名鼎鼎的shuffle算法。2.相关知识2.1 算法描述考虑了不需要额外地申请空间,所以需要再数组内部进行调整。for i=1 to n do swap( a[i], a[random(i,n)] );2.2 数学证明...

2019-10-20 15:54:16 420

原创 Linux下使用eventfd实现进程间信号量操作

1 前言起源来自于单线程epoll_wait内部处理queue的思考,后来发现了linux支持一种自定义事件的fd,查找资料之余又发现了eventfd还有多进程信号灯的用处。。。本文翻译了eventfd的用法,并在文末附带demo进行实践。新的改变ommand + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + Shif...

2019-09-19 00:43:01 591

原创 Linux下使用ZMQ实践之与libevent结合

1. 前言        最近考虑到一个问题,项目中有同时处理socket、zeromq的逻辑需求,想通过libevent(I/O服用)一块将zmq-socket的事件也放一个线程中处理。        网上了解了一些实现,大部分都是通过将zmq的sockfd拿到,加入libevent_dispatch中一并处理,...

2019-06-27 00:59:25 816

原创 Linux下使用ZMQ实践之监控事件

1. 前言继续《Linux下使用ZMQ实践“生产者-消费者”模型》 文章之后进一步思考:ZeroMQ通过隐藏了基础的socket操作,达到调用简明易懂的层次;那么,如果某些场景下,又需要考虑到连接状态的维护,应该如何操作?ZeroMQ给出的解决方案就是zmq_socket_monitor2. 相关知识支持监控的事件:事件描述ZMQ_EVENT_CONNECTED...

2019-06-26 00:09:23 995

原创 Linux下对libevent的evbuffer模块裁剪移植

目录列表1. 背景2. 源码分析2.1 结构体分析2.2 主要接口3.裁剪3.1 兼容性定义3.2 裁剪实现3.1 chain相关操作3.2 evbuffer的操作3.3 运行测试4. 结论1. 背景libevent作为一款高效的网络开发库,内部模块也有许多优秀的实现。evbuffer为libevent的核心缓冲器功能,提供了与I/O的操作的高效结合:数据拷贝、移动、读写。上篇文章《Lin...

2019-06-02 17:24:53 197

原创 Linux下使用gtest对接口进行单元测试

目录1. 背景2. gtest 断言2.1 布尔值判断2.2 二进制比较2.3 字符串比较2.4 浮点数比较3. 实践3.1 框架使用3.2 用例编写3.3 编译运行4.结论1. 背景工程中涉及基础接口的设计,为了保证接口的质量,所以需要进行单元测试:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。单元测试需要构建测试代码(开源软件中一般都提供了tests目录)...

2019-06-02 15:15:40 807

原创 c语言快速数独生成器

1.准备继上篇文章《c语言暴力递归实现数独求解》 思路,本章编写一个数独生成器,按照数独的规则生成题目,但不保证题目可解。2.思路按照数独的规则:水平方向的每一横行有九格,每一横行称为行(Row)垂直方向的每一纵列有九格,每一纵列称为列(Column)三行与三列相交之处有九格,每一单元称为小九宫(Box、Block)格子上填入1-9数字,使1-9每个数字在每一行、每一列和每一宫中都...

2019-05-23 00:07:01 3087

原创 c语言暴力递归实现数独求解

数独求解1. 简介1.1 规则介绍1.2 解法介绍2 程序思路2.1 数据的存储表示2.2 数独检查2.2 数独计算2.3 调用3. 调用运行4. 总结1. 简介1.1 规则介绍Wiki-数独百科-数独九宫格的定义:水平方向的每一横行有九格,每一横行称为行(Row)垂直方向的每一纵列有九格,每一纵列称为列(Column)三行与三列相交之处有九格,每一单元称为小九宫(Box、B...

2019-05-21 01:14:37 1385

原创 Linux使用ragel进行文本快速解析(下)

1、前言  《Linux使用ragel进行文本快速解析(上)》文中对Ragel进行了初步介绍,并给出了一个atoi的例子,本文接着再给出一个文本行解析的例子2、思路  awk的主要是对固定列数的文本进行内容解析,若使用 awk命令的话,是进行逐行解析。同样的,使用 Ragel 写的思路也是,编写正则以行为单位,进行读取解析。但是相比命令的方式,Ragel 相当于可编程处理,则能灵活地对不固定...

2019-04-13 23:07:26 522

原创 Linux使用ragel进行文本快速解析(上)

Linux使用ragel进行文本快速解析1、前言2、相关知识2.1、简介2.1.1 Ragel 优势2.1.2 Ragel 特性2.2 状态机(mechine)概念2.3 动作(action)的概念2.4 流程设计3、案例实践3.1 源码分析3.2 编译4、结论参考文章:1、前言  在项目中我们经常涉及一些文本解析处理的场景,大部分场景是进行简单解析且数据量不大,但本文要讨论的是某些特定场景下...

2019-04-13 20:36:10 2400

原创 Linux下使用zlib实现文件压缩解压

Linux下使用zlib实现文件压缩解压1.背景2.思路3.实现3.1 函数入口3.2 压缩文件3.3 解压文件4.运行5.结论1.背景上篇文章《Linux下使用zlib实现数据压缩解压》对文本数据进行压缩处理,本文再进行zlib的案例进行学习,这次整理出了文件压缩例子。2.思路查看 zlib-1.2.11/examples/zpipe.c代码,发现他的处理是从stdin获取原始数据,再从...

2019-04-10 23:57:59 4162

原创 Linux下使用fuse编写自己的文件系统

一、前言近几天调研了一下fuse编写文件系统的方法,先尝试拿fuse写一套类似tmpfs的简易文件系统,文件信息都保留在内存中。文件系统需要一个数据结构来管理文件节点 inode,正好《c语言实现map-使用内核红黑树》一文将rbtree结构拿出来了可以用上。目标:支持文件读写操作:echo、cat;支持目录操作ls、mkdir、cd。二、知识准备FUSE(Filesystem i...

2018-09-28 12:51:38 10181 1

原创 c语言map的实现-使用内核红黑树

一、前言内核数据结构中,上次讲了一次内核链表的使用《c语言双向循环链表实现-使用内核链表》,这次再接着讲一下内核中常用的&lt;key,value&gt;结构,红黑树(rbtree)。二、相关知识2.1 红黑树特点红黑树为自平衡二叉查找树,具备了以下几种特征[1]:节点是红色或黑色。 根是黑色。 所有叶子都是黑色(叶子是NIL节点)。 每个红色节点必须有两个黑色的子节点...

2018-09-27 17:36:41 16253

原创 Linux下快速删除大量小文件的方法探索

一、前言Linux服务器磁盘中存在大量小文件,需要进行删除(文件小于1K,数量50w~100w),发现rm删除速度奇慢无比,甚至出现“argument list too long”的错误。网上资料一搜索基本都是建议rsync方法,所以本文对几种常见的方法进行试验对比。二、相关知识2.1 文件系统的元数据(metadata)1)superblock:记录文件系统的整体信息,包含ino...

2018-09-24 08:36:29 6141

原创 Linux下使用ZMQ实践“发布-订阅”模型

一、背景    继续ZMQ系列,本期我们看一下“单生产者-多消费者”的编程场景,使用ZMQ_PUB/ZMQ_SUB实践“发布-订阅”模型二、相关知识2.1 ZMQ_PUBZMQ_PUB A socket of type ZMQ_PUB is used by a publisher to distribute data. Messages sent are distributed in a ...

2018-06-24 13:37:50 2960

原创 Linux下使用protobuf-c实现自定义协议

1、背景需求    通信协议设计,考虑了后续跨语言的支持(如Java、Python、C),需求一种序列化、反序列化的库2、相关知识    Google Protocol BUffer 提供了一种适用于RPC系统、持续数据存储系统的混合语言数据标准,可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前有C++、C、Java、Python三种语言的API。2.1 pro...

2018-05-12 20:37:36 9040 2

原创 Linux下使用ZMQ实践“请求-响应”异步服务器模型

一、背景    上一篇文章《Linux下使用ZMQ实践“请求-响应”服务器模型》中使用的是REP-REQ套件,该套件的特点是必须一个请求对应一个响应,如果在应用中不想使用同步处理的方式呢?ZMQ有没有提供异步处理的方法?答案是使用DEALER-ROUTER套件。    另外如何在多线程中安全传递消息的方法可以参见《Linux下使用ZMQ实践“生产者-消费者”模型》ZMQ_PULL、ZMQ_PUSH...

2018-03-20 00:23:09 1311

原创 Linux下使用ZMQ实践“生产者-消费者”模型

一、背景    上一篇文章《Linux下使用ZMQ实践“请求-响应”模型》引入了ZMQ的实践案例,本章继续实践编程模型中常用的“生产者-消费者”模型。二、相关知识    ZMQ_PUSH、ZMQ_PULL模型是单发单收的模型,你只能在ZMQ_PUSH套接字上进行send操作,而不能进行recv,反之一样: ZMQ_PUSH A socket of type ZMQ...

2018-03-17 23:02:51 888

原创 Linux下使用ZMQ实践“请求-应答”服务模型

一、背景    在C/S编程模式中,经常需要进行进程间消息传递,常用的模式是“请求-应答”方式,客户端通过发起请求,服务端进行处理再进行回复,如果使用socket去实现,难免还要实现消息的分包、连接状态的维护的功能。    ZMQ(ZeroMQ、0MQ)则是一种高性能的异步消息库,接口风格类似于套接字实现,但又将sockfd的相关细节隐藏起来。支持线程间、进程间通信、一对多、多对一节点处理,外部的...

2018-03-17 21:33:06 1103

原创 Linux下使用hiredis库实现优先级队列

一、背景需求    需求主要为:    1、优先级分为高、中、低(优先级队列);    2、支持多生产者、多消费者模型(解决竞争);    3、期间进程退出,队列内容不会丢失(持久化);    选型方面考虑了第三方工具,先调研了一下Redis,发现其中LIST数据结构非常适用上诉需求;二、相关知识2.1 List结构    Redis List是Redis最重要的数据结构之一,内部实现是一个双向链...

2018-03-03 15:27:50 754

原创 Linux下使用zlib实现数据压缩解压

本文举例说明了:项目过程中字符串数据传输的场景下(文件名列表),如何使用数据压缩减少带宽的开销;deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码;zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有zlib,zlibex)gzip(RFC1952):一种格式,也是对deflate进行的封装。gzip = gzip头 + deflate编码的实际内容 + gzip尾zlib = zlib头 + deflate编码的实

2018-01-29 23:11:50 6935

原创 Linux下使用bufferevent实现tcp代理功能

bufferevent是libevent网络库的一套接口,内部实现了对socket的封装,对外提供数据读写接口,支持并发编程的场景;外部使用接口时仅需考虑业务逻辑的处理,无需在意socket的处理细节;

2017-12-10 21:15:26 1264

原创 Linux下使用inotify实现文件监控

工程中需要对某个文件夹下的文件进行监控,文件、目录发生变化后需要进行处理;普通的方法是通过循环不停遍历文件夹,但文件数量较多时,将导致判定时间较长,并且无法区分文件使用正在使用;Linux2.6后提供了一种inotify 对文件系统进行监控,通过触发的方式告诉你文件的变化,从而代替以往循环遍历的方式;

2017-12-07 22:49:21 3412

原创 Linux下使用libcurl库实现ftp上传文件

libcurl库是一个实现了各种客户端协议的网络编程库。目前它支持12种以上的协议,包括 FTP、HTTP、Telnet以及其他安全变体[4]。libcurl 库为 C 和 C++ 之类的语言添加了类似的功能,但是它可以在不同的语言之间移植。libcurl 都是偏向阻塞的套接字使用场景,即不好配合 I/O复用场景,更适用于多线程、多进程场景;

2017-05-21 22:27:32 3390

原创 Linux下使用libevent库实现服务器端编程

TCP服务器端一般用到非阻塞Socket、IO复用,Linux可以支持epoll、select,而Windows支持select、IOCP,考虑平台适用性,需要对IO事件进行封装兼容;libevent是一个轻量级的高性能的网络库,使用libevent 进行服务器端开发非常方便,无须过多干涉网络编程的细节,不过还得真正去理解网络处理的原理;同时,evbuffer内部的缓冲处理也为上层应用提供了不少便利,能够给项目开发带来可观的效率提升;

2017-05-07 23:14:04 2780

原创 Linux下使用readline库实现2048游戏

《2048》的初始数字则是由2+2组成的基数4。在操作方面的不同则表现为一步一格的移动,变成更为爽快的一次到底。相同数字的方况在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出「2048」这个数字方块。本文在Linux下c语言实现2048的玩法。

2017-03-26 22:37:40 594

原创 Linux下使用readline库编程实现多级CLI菜单

CLI命令行交互对于使用者而言,就是专业、高效;而GUI界面式的交互就是直观、易用;本实现根据 readline/example/fileman.c 案例进行修改;考虑设计多级菜单选项时,需要通过提示符进行切换,如 "system >"、"system (route) >"、"system (route-config) >"提示所在的菜单项;并且在每个菜单项下,需要支持不同的命令集,对不同的命令进行相应操作,如 open 加载配置、write 保存配置、quit返回上级、exit 退出程序等操作;

2017-03-23 23:55:08 2045

原创 Linux下使用openssl库编程实现对称加密解密

3DES是加强版的对称加密算法,同时CBC工作模式是最广泛使用的模式,他能够保证加密后的数据块是上下文关联的,不容易受到重放攻击;编程上使用OpenSSL的EVP接口集能够比较方便地完成加密解密过程,并且不用过多考虑字节补齐的问题,EVP加解密过程中会自动扩充、还原数据长度;

2017-03-14 22:49:26 3504

原创 c语言进程池的简单实现

从Nginx使用线程池/进程池处理大并发的思路去分析,其实就是多客户端大量连接的场景;主进程监听是否有新客户端tcp连接,然后分发给工作进程去响应http请求,在这种场景下每个连接都是一个独立的上下文逻辑,每个工作进程的内容都是对等地处理http请求,这种情况就非常适合进程池的方式;

2017-03-13 23:28:38 4107

原创 c语言最小堆的实现-优先队列

libevent 中有定时事件的管理,用户可以把超时的定时事件插入到 管理器中,当时间到了之后触发用户的回调函数处理;查看了源码发现,定时器的数据结构其实是由最小堆来实现的。优先队列为完全二叉树,所以在插入调整的时间复杂度为 O(N),弹出的复杂度为O(1);

2017-02-25 15:07:48 2950

Android创建Service后台常驻服务并使用Broadcast通信

Android创建Service后台常驻服务并使用Broadcast通信,即基于Broadcast通信方式实现了一种Service Thread与Activity异步工作的方法。

2015-04-19

Android自定义摇杆实现蓝牙控制小车

1)控制摇杆由摇杆(小圆)和底座(大圆)组成; 2)全屏触摸,摇杆位置不离开底座范围; 3)停止触摸,摇杆恢复到中心,小车停止运动; 4)摇杆分成6个方向,分别控制小车 前进、后退、前进左、前进右、后退左、后退右。

2015-05-17

Linux-2048

Linux下使用readline库实现2048游戏

2017-03-26

空空如也

空空如也

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

TA关注的人 TA的粉丝

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