您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

UNIX C语言必备实用第三方库

时间:2023-01-16 15:08:08  来源:今日头条  作者:码哥比特

对于广大C语言开发者来说,缺乏类似C++ STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。

今天,码哥给大家带来一款基础库,这套库不仅仅提供了常用的数据结构、算法,如红黑树、斐波那契堆、队列、KMP算法、RSA算法、各类哈希算法、数据恢复算法等等,还提供了多进程框架、多线程框架、跨平台高性能事件等实用内容。注意:这是一款不依赖第三方的库。

除此以外,它也是笔者之前文章(Melang脚本语言)中的核心库。这也就意味着,使用该库,不仅可以快速获得上述内容,还可以让开发者所构建的系统很方便地引入脚本语言的功能。

它就是——Melon


 

下面,码哥便带诸位一览这个库的功能。

数据结构

Melon中包含如下数据结构的实现:

 

  • 双向链表
  • 斐波那契堆
  • 哈希表
  • 队列
  • 红黑树
  •  

 

其中:

 

  • 双向链表使用宏实现,可以通过两行宏函数即可完成双向队列插入和删除操作的声明和定义。
  • 斐波那契堆是一个最小堆,在库中的事件功能中用于实现定时器的维护管理,当然,也可以单独使用。

 

以上结构几乎均可在其对应名称的头文件中找到数据结构定义以及函数定义。

一般情况下,数据结构的使用都是函数调用形式,因此也尽可能降低了不同组件间的耦合度。

算法

Melon中包含的算法如下:

 

  • 加密算法:AES 、DES 、3DES 、RC4 、RSA
  • 哈希算法:MD5 、SHA1 、SHA256
  • Base64
  • 大数计算
  • FEC
  • JSON
  • 矩阵运算
  • 里德所罗门编码
  • 正则匹配算法
  • KMP
  • Cron格式解析器

 

如上算法基本都在其各自头文件中可以找到对应的函数声明以及必要的数据结构定义。

其中,FEC与里德所罗门编码均属于纠错码,FEC常用于RTP中做数据修复,而里德所罗门编码既可以用于实时语音中丢包恢复,也可以用于冗余阵列(RAID)和其他UDP丢包恢复的场景。关于里德所罗门编码,感兴趣的读者可以阅读码哥之前的文章:神奇的数据恢复算法。

其他组件

前面的都是常规操作,这里才是重头戏。

Melon中还包括如下实用组件:

 

  • 错误码管理
  • 内存
  • 线程池
  • I/O线程模型
  • 数据链
  • TCP 封装
  • 事件机制
  • 文件缓存
  • HTTP 处理
  • 脚本语言
  • 词法分析器
  • 语法解析器生成器
  • websocket

 

因Melon作者Nginx中毒较深,所以Melon中部分机制与Nginx较为相似。

内存池:这里内存池不仅支持对从堆中分配的内存进行管理,还支持对共享内存的管理。

数据链与TCP封装:TCP封装中包含了阻塞与非阻塞下的收发逻辑,并利用数据链结构来存放发送数据与接收数据。

事件机制:事件机制中不仅支持epoll、select,还支持Kqueue,库在编译前会自行检测平台支持情况。事件包含了:

 

  • 句柄(文件描述符)事件:读、写、出错事件,以及超时事件(主要用于超时断开链接);
  • 定时事件(与句柄超时是两码事);
  • 信号处理事件:这里的信号处理并非一个信号只能有一个处理事件,而是设置多少个处理函数就会执行多少个;

 

文件缓存:参考Nginx文件缓存,避免对同一文件的重复打开浪费文件描述符资源。

HTTP:包含了HTTP的接收解析和发送,该套接口依赖于数据链结构来进行处理,因此可配合TCP封装一同使用。

脚本语言:内容较多,可另行参考:Melang脚本语言。

词法分析器:之所以这个单独算一个功能组件,是因为在Melon中,配置文件解析就是使用该词法分析器处理的。仅通过三行C代码就可以实现一个最最基础的词法分析器,这也归功于C语言宏的强大。

websocket:该部分依赖于HTTP组件。

多进程:多进程采用一主多从模式,主进程做管理,从进程处理实际业务。主进程与从进程之间由socketpair相连,因此从进程异常退出,主进程会立刻拉起一个新的子进程,同时主子进程也可以通过该socketpair进行数据通信。除了自身子进程可以管理,也可以通过配置文件配置来拉起其他程序作为自己的子进程来管理,有些类似于supervisord。

多线程:多线程分为三类,一类是常规的线程池,一类是IO线程,还有一类是模块化的线程。后者也是一主多从模型,主与子之间是通过socketpair进行通信,而每一个子线程都有其入口函数(类似main函数),每一个子线程通常都是处理一类单一事务。

使用举例

上面说了那么多,下面就来看一个多进程的例子。

首先,我们要先安装Melon:

$ git clone https://github.com/Water-Melon/Melon.git$ ./configure$ make$ sudo make install$ sudo echo "/usr/local/melon/lib/" >> /etc/ld.so.conf$ sudo ldconfig

安装好后,Melon会被安装在/usr/local/melon下。

接着,我们创建一个名为hello.c的源文件来完成我们期望的功能:

#include#include "mln_core.h"#include "mln_log.h"#include "mln_event.h"char text[1024];static int global_init(void);static void worker_process(mln_event_t *ev);static void print_handler(mln_event_t *ev, void *data);int main(int argc, char *argv[])struct mln_core_attr cattr;cattr.argc = argc;cattr.argv = argv;cattr.global_init = global_init;cattr.worker_process = worker_process;return mln_core_init(&cattr);static int global_init(void)//global variable init functionint n = snprintf(text, sizeof(text)-1, "hello worldn");text[n] = 0;return 0;static void worker_process(mln_event_t *ev)//we can set event handler here//let's set a timermln_event_set_timer(ev, 1000, text, print_handler);static void print_handler(mln_event_t *ev, void *data)mln_log(debug, "%sn", (char *)data);mln_event_set_timer(ev, 1000, data, print_handler);

这段代码主要是初始化了一个全局变量,然后给每一个子进程创建了一个定时事件,即每一秒中输出一个hello world。

我们先进行编译链接生成可执行程序:

$ gcc -o hello hello.c -I /usr/local/melon/include/ -L /usr/local/melon/lib/ -lmelon

然后,我们需要先修改Melon库的配置文件:

$ sudo vim /usr/local/melon/conf/melon.conflog_level "none";//user "root";daemon off;core_file_size "unlimited";//max_nofile 1024;worker_proc 1;thread_mode off;framework off;log_path "/usr/local/melon/logs/melon.log";* Configurations in the 'exec_proc' are the* processes which are customized by user.* Here is an example to show you how to* spawn a program.* keepalive "/tmp/a.out" ["arg1" "arg2" ...]* The command in this example is 'keepalive' that* indicate master process to supervise this* process. If process is killed, master process* would restart this program.* If you don't want master to restart it, you can* default "/tmp/a.out" ["arg1" "arg2" ...]* But you should know that there is another* arugment after the last argument you write here.* That is the file descriptor which is used to* communicate with master process.exec_proc {// keepalive "/tmp/a";thread_exec {// restart "hello" "hello" "world";// default "haha";

我们做如下修改:

 

  • framework off; --> framework on;
  • worker_proc 1; --> worker_proc 3;

 

这样,多进程框架将被启用,且会产生三个子进程。

程序启动后如下:

$ ./helloStart up worker process No.1Start up worker process No.2Start up worker process No.302/08/2021 09:34:46 GMT DEBUG: hello.c:print_handler:39: PID:25322 hello world02/08/2021 09:34:46 GMT DEBUG: hello.c:print_handler:39: PID:25323 hello world02/08/2021 09:34:46 GMT DEBUG: hello.c:print_handler:39: PID:25324 hello world02/08/2021 09:34:47 GMT DEBUG: hello.c:print_handler:39: PID:25322 hello world02/08/2021 09:34:47 GMT DEBUG: hello.c:print_handler:39: PID:25323 hello world02/08/2021 09:34:47 GMT DEBUG: hello.c:print_handler:39: PID:25324 hello world

这时,可以ps看一下,一共存在四个hello进程,一个为主,其余三个为子进程。

小结

事实上,Melon并不会有过多条条框框需要开发者小心谨慎怕踩坑。与Sk.NET类似,Melon(repo: Water-Melon/Melon)提供的绝大多数内容都可独立使用,而不必一定与多进程多线程框架结合。因此,这也给了使用者极大的自由度。

感谢阅读,欢迎各位在评论区留言评论。



Tags:C语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
对于广大C语言开发者来说,缺乏类似C++ STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。...【详细内容】
2023-01-16  Tags: C语言  点击:(0)  评论:(0)  加入收藏
众所周知,C语言在嵌入式开发中占据着十分重要的地位,为什么嵌入式开发要选择C语言?嵌入式开发的方向可以分为单片机开发、Linx应用开发和现场可编辑逻辑门阵列(FPGA)开发,不同于...【详细内容】
2023-01-03  Tags: C语言  点击:(2)  评论:(0)  加入收藏
在Linux开发环境上学习C语言,对于一个从零开始学习嵌入式的门外汉来说,是一个很好的选择,学习了C语言,又熟悉了Linux 操作系统。1. 开发工具下载及安装:虚拟机 VMware 10下载地址...【详细内容】
2022-11-10  Tags: C语言  点击:(76)  评论:(0)  加入收藏
“协程”(coroutine),就是把Linux epoll的异步IO机制通过长跳转(long jmp)封装起来,形成一个在用户看来“连续的”流程。所有操作系统的异步IO,都分为启动函数和回调函数。以Linux...【详细内容】
2022-10-08  Tags: C语言  点击:(87)  评论:(0)  加入收藏
很多人会有一个疑问C语言编译器为什么能够用C语言编写?今天就来带大家一探究竟!所谓C语言编译器,就是把编程得到的件,比如.c,.h的件,进行读取,并对内容进行分析,按照C语言的规则,将...【详细内容】
2022-09-25  Tags: C语言  点击:(90)  评论:(0)  加入收藏
函数指针函数也有自己的地址,函数名/&函数名 就是函数的地址 1.1基本形式在 数组指针的学习中我们了解到int arr[5]; int (*pa)[5] = &arr;//pa是数组指针指针变量pa的类型...【详细内容】
2022-09-07  Tags: C语言  点击:(134)  评论:(0)  加入收藏
在go语言中使用viper之类的库很方便的处理yaml配置文件,但是在c语言中就比较麻烦,经过一番思索和借助强大的github,发现了一个libyaml c库,但是网上的例子都比较麻烦,而且比较繁...【详细内容】
2022-07-07  Tags: C语言  点击:(160)  评论:(0)  加入收藏
今天给大家分享一篇C语言编码规范,可以从源头上规避掉很多bug,希望能对大家有所帮助。 01 最重要的规则编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。 作为维护...【详细内容】
2022-07-04  Tags: C语言  点击:(177)  评论:(0)  加入收藏
什么编程语言最好?这是个能让各路程序员吵翻天的话题,每种语言都有自己的拥趸,全球现在找出三五十种编程语言都不是问题,热门的至少也有20种,先不说这些语言好用与否,它们的性能也...【详细内容】
2022-07-01  Tags: C语言  点击:(126)  评论:(0)  加入收藏
C语言是一种基础语言,广泛用于操作系统和编译器的开发,功能非常强大。以下是 C 语言的八个优点:1.简洁、紧凑、灵活、方便C语言只有32个关键字和9个控制语句。程序可以自由编写...【详细内容】
2022-06-16  Tags: C语言  点击:(11)  评论:(0)  加入收藏
▌简易百科推荐
对于广大C语言开发者来说,缺乏类似C++ STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。...【详细内容】
2023-01-16  码哥比特  今日头条  Tags:C语言   点击:(0)  评论:(0)  加入收藏
概念 类模板 std::function 是通用多态函数包装器。 std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标——...【详细内容】
2023-01-12  骇客遇见AI  今日头条  Tags:C++   点击:(8)  评论:(0)  加入收藏
C 是用于开发系统软件和任何微处理器软件的经典语言。 Linux,大部分Windows和MacOS都是写在上面的。 如果你使用任何现代可穿戴小工具或电子设备,在大多数情况下它们也会在 C...【详细内容】
2023-01-07  启辰8  今日头条  Tags:C++   点击:(5)  评论:(0)  加入收藏
众所周知,C语言在嵌入式开发中占据着十分重要的地位,为什么嵌入式开发要选择C语言?嵌入式开发的方向可以分为单片机开发、Linx应用开发和现场可编辑逻辑门阵列(FPGA)开发,不同于...【详细内容】
2023-01-03  沐沐渥生    Tags:嵌入式开发   点击:(2)  评论:(0)  加入收藏
一:背景1. 讲故事前些天看到一个奇怪的 Function 函数,调用的是 C# 链接库中的一个 UserLogin 方法,参考代码如下:CREATE FUNCTION dbo.clr_UserLogin( @name AS NVARCHAR(1...【详细内容】
2023-01-03  一线码农聊技术  今日头条  Tags:C#   点击:(21)  评论:(0)  加入收藏
CLion是一款专为开发C及C++所设计的跨平台IDE。它是以intellij为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows...【详细内容】
2022-12-27    网易号  Tags:C++   点击:(27)  评论:(0)  加入收藏
我们可以通过 时间度量 - Wall time vs. CPU time 来知道Wall time和CPU time的区别是什么,简单来讲,Wall Time就是类似我们的时钟一样,他没有很精确的表示此时CPU花了多少时...【详细内容】
2022-12-23  编编成程  今日头条  Tags:C++   点击:(24)  评论:(0)  加入收藏
数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。C++语言支持广泛的数据类型,如下: 数据类型选择: 当明确知道数值不可能为负时,选用无符号类型。 使用...【详细内容】
2022-12-08  西子浣纱城  今日头条  Tags:C++   点击:(34)  评论:(0)  加入收藏
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。 首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我...【详细内容】
2022-11-16  疯狂学习GIS  CSDN  Tags:C++   点击:(42)  评论:(0)  加入收藏
在Linux开发环境上学习C语言,对于一个从零开始学习嵌入式的门外汉来说,是一个很好的选择,学习了C语言,又熟悉了Linux 操作系统。1. 开发工具下载及安装:虚拟机 VMware 10下载地址...【详细内容】
2022-11-10  嵌入式er  知乎  Tags:C语言   点击:(76)  评论:(0)  加入收藏
站内最新
站内热门
站内头条