structc 开源框架简介
程序员文章站
2022-03-18 15:13:39
了解 "structc https://github.com/wangzhione/structc" structc 是 C 构建基础项目框架. 不是太惊艳, 但绝对是 C 简单项目中一股清流. 它的前身是 simplec 框架. "simplec https://github.com/wangzh ......
了解
structc-https://github.com/wangzhione/structc
structc 是 C 构建基础项目框架. 不是太惊艳, 但绝对是 C 简单项目中一股清流. 它的前身是 simplec 框架.
simplec - https://github.com/wangzhione/simplec
二者相比. structc 框架更加自然. 力求贴合 C 项目开发的原始状态. 所有写的代码, 心愿就是 向着标准库, 操作系统, 编译器靠拢! 例如下面代码
#ifndef _H_THREAD #define _H_THREAD #include <struct.h> #include <pthread.h> #include <semaphore.h> // // pthread_run - 异步启动线程 // id : &tid 线程id地址 // frun : 运行的主体 // arg : 运行参数 // return : 返回线程构建结果, 0 is success // #define pthread_run(id, frun, arg) \ pthread_run_((id), (node_f)(frun), (void *)(intptr_t)(arg)) inline int pthread_run_(pthread_t * id, node_f frun, void * arg) { return pthread_create(id, NULL, (start_f)frun, arg); } // // pthread_end - 等待启动线程结束 // tid : 线程id // return : void // inline void pthread_end(pthread_t tid) { pthread_join(tid, NULL); } // // pthread_async - 异步启动分离线程 // frun : 运行的主体 // arg : 运行参数 // return : 返回 0 is success // #define pthread_async(frun, arg) \ pthread_async_((node_f)(frun), (void *)(intptr_t)(arg)) inline int pthread_async_(node_f frun, void * arg) { int ret; pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ret = pthread_create(&tid, &attr, (start_f)frun, arg); pthread_attr_destroy(&attr); return ret; } #endif//_H_THREAD
有时候想问为什么喜欢用 C 写这些毫无营养的 东东. 在回答这个问题之前. 引述 golang.org 中一段代码
// You can edit this code! // Click here and start typing. package main import "fmt" func main() { fmt.Println("Hello, 世界") }
(: 说 real 的, 在写的溜语言中, 唯独 Go 很好用, 但 * 真丑.) 猜测可能还是, C 有点意思 ~
借 - https://y.qq.com/n/yqq/song/002WLDmw0vkHtC.html
曾经多少个夜晚 在敲那些字符 printf("Hello World");
解说
不妨说说 structc 的构成 引进部分: 1. 内存池选用 jemalloc 2. 复用 IO 选用 libuv 3. 线程模型选用 pthtread 补充部分 : 在 winds 争取实现 linux 一样的内容 1. errno, strerror 机制 2. socket 机制 3. select / epoll 机制 4. time 机制 5. atom 机制 ... ... 核心部分 1. mq.h 队列 - https://github.com/wangzhione/structc/blob/master/structc/struct/mq.h 2. dict.h 字典 - https://github.com/wangzhione/structc/blob/master/structc/struct/dict.h 3. tstr.h 字符串 - https://github.com/wangzhione/structc/blob/master/structc/struct/tstr.h 4. list.h 单链表 - https://github.com/wangzhione/structc/blob/master/structc/struct/list.h 5. rtree.h 红黑树 - https://github.com/wangzhione/structc/blob/master/structc/struct/rtree.h 6. array.h 动态数组 - https://github.com/wangzhione/structc/blob/master/structc/struct/array.h ... ... 也许可以说, 数据结构 当前 仍是软件设计的源头吧. 本文虽然作为 structc 拉粉的软文. 但是感觉其中有些数据结构的设计思路很值得借鉴. 例如 mq.h 中队列 empty or full 思路
// // pop empty <=> tail == -1 ( head == 0 ) // push full <=> head == tail + 1 // struct mq { int head; // 头结点 int tail; // 尾结点 int size; // 队列大小 void ** queue; // 队列实体 atom_t lock; // 队列原子锁 volatile bool fee; // true表示销毁状态 };
dict.h 中关于素数表的引入
// // primes - 质数表 // const unsigned primes[][2] = { { (1<<6)-1 , 53 }, { (1<<7)-1 , 97 }, { (1<<8)-1 , 193 }, { (1<<9)-1 , 389 }, { (1<<10)-1 , 769 }, { (1<<11)-1 , 1543 }, { (1<<12)-1 , 3079 }, { (1<<13)-1 , 6151 }, { (1<<14)-1 , 12289 }, { (1<<15)-1 , 24593 }, { (1<<16)-1 , 49157 }, { (1<<17)-1 , 98317 }, { (1<<18)-1 , 196613 }, { (1<<19)-1 , 393241 }, { (1<<20)-1 , 786433 }, { (1<<21)-1 , 1572869 }, { (1<<22)-1 , 3145739 }, { (1<<23)-1 , 6291469 }, { (1<<24)-1 , 12582917 }, { (1<<25)-1 , 25165843 }, { (1<<26)-1 , 50331653 }, { (1<<27)-1 , 100663319 }, { (1<<28)-1 , 201326611 }, { (1<<29)-1 , 402653189 }, { (1<<30)-1 , 805306457 }, { UINT_MAX , 1610612741 }, };
说起 (1<<6) - 1 不妨问问大家 (2 ^ 6) - 1 是多少 ? 是不是也很有意思 : ) 或者 rtree.h 中
// // 红黑树通用结构, 需要将 $RTREE 放在结构开头部位 // struct $rtree { uintptr_t parentc; struct $rtree * left; struct $rtree * right; };
等等 ... ... 不一一列举. structc 的代码很有实战参照意义. 有兴趣的同学可以详细看看, 顺带肉眼帮我提提 BUG, 在此表示感谢 . : )
后继
错误是难免的, 欢迎指正. 这里最后开启程序员写代码模式, 跳个函数结尾
// _str_printf : 成功直接返回 static char * _str_printf(const char * format, va_list arg) { char buf[BUFSIZ]; int len = vsnprintf(buf, sizeof buf, format, arg); if (len < sizeof buf) { char * ret = malloc(len + 1); return memcpy(ret, buf, len + 1); } return NULL; } // // str_printf - 字符串构建函数 // format : 构建格式参照pritnf // ... : 参数集 // return : char * 堆上内存 // char * str_printf(const char * format, ...) { char * ret; int len, cap; va_list arg; va_start(arg, format); // BUFSIZ 以下内存直接分配 ret = _str_printf(format, arg); if (ret != NULL) return ret; cap = BUFSIZ << 1; for (;;) { ret = malloc(cap); len = vsnprintf(ret, cap, format, arg); // 失败的情况 if (len < 0) { free(ret); return NULL; } // 成功情况 if (len < cap) break; // 内存不足的情况 free(ret); cap <<= 1; } return realloc(ret, len + 1); }
人生 一块开心 最好 : )
上一篇: 想用人工智能重塑一切设备 谷歌能成功吗?
下一篇: linux常用命令汇总
推荐阅读
-
Apache Shiro 框架简介
-
我爱Flask框架之Flask简介与URL和视图介绍
-
Python的Flask框架的简介和安装方法
-
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
-
分享一个C++与Python开发的中小型通用游戏服务端框架(跨平台,开源,适合MMORPG游戏)
-
Farseer.net轻量级开源框架 入门篇:添加数据详解
-
Android 优秀开源框架大全
-
[开源] 基于Layui组件封装的后台模版,HG-Layui-UI通用后台管理框架V1.0版
-
JavaScript中七种流行的开源机器学习框架
-
Laravel框架Blade模板简介及模板继承用法分析