在程序界的远古时期,大神们手持键盘敲着机器语言跟庞大的机器打着交道,那时候机器语言还没有语义和语法,更没有封装的概念。后来进化到汇编语言,C语言时期,基础的功能特性就已经能满足当时的需求了,比如函数封装使其得于复用,但随着计算机的普及,操作系统的到来,面向过程语言已无法继续满足复杂的需求。
继续阅读 »
tbox的默认内存分配,是完全基于自己的内存池架构,支持内存的快速分配,和对碎片的优化,并且支持各种内存泄露、溢出检测。
如果不想用tbox内置的默认内存分配管理,也可以灵活切换到其他分配模式,因为tbox现在已经完全支持allocator架构,
只要在init阶段传入不同的分配器模型,就能快速切换分配模式,例如:
```c
/* 采用默认的tbox内存管理,启用内存池维护、碎片优化、内存泄露溢出检测等所有特性
* 相当于使用了:tb_default_allocator(tb_null, 0)
*/
tb_init(tb_null, tb_null);
/* 采用默认的tbox内存管理,启用
继续阅读 »
生成二叉树
type Node struct {
data string
left *Node
right *Node
}
nodeG := Node{data: "g", left: nil, right: nil}
nodeF := Node{data: "f", left: &nodeG, right: nil}
nodeE := Node{data: "e", left: nil, right: nil}
nodeD := Node{data: "d", left: &nodeE, right: nil}
nodeC := Node{data: "c", left: nil, right:
继续阅读 »
导出所有的数据库
mysqldump -uuserName -ppassword --all-database > D:/all.sql
需要注意的是,该命令需要在MySql的安装目录的bin目录下使用,例如在bin下输入mysqldump,会给出提示信息
bash
C:\Program Files\MySQL\MySQL Server 5.6\bin > mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldum
继续阅读 »
tbox对于数据文件的解析提供了完善的支持,可以对各种二进制数据,文件数据流,网络数据流等进行各种解析操作
并且提供了一整套字节解析、比特位解析的接口,来支持各种流模式:
stream
通用数据流,提供对流式数据的读写和解析,支持多层流嵌套以及各种协议(http, socket, file, data ...)
对于如何使用stream,这里暂时不详细介绍了,之后会单独重点介绍下,这里主要是为了描述,如何使用stream来处理字节数据的解析
例如,我要从数据流中,读取一个大端的16bits数值,很简单,只要:
c
tb_uint16_t value;
if (tb_stream_bread_u16_be(stream,
继续阅读 »
首先做了笔试题, 我觉得笔试题非常好, 才对公司有兴趣的.
笔试题忘记了
二面
全程英文,问了很多问题
算法,判断一个数是否power of two的方法
这个有多种办法,不断除以2是最笨的方法;还可以用二进制,直接&1判断最后一位是不是1;还有利用 C 语言库函数等等;
继续阅读 »
ctypes是一个Python库,可以提供C中的数据类型,调用链接库中的函数.
1.加载动态链接库
使用cdll.LoadLibrary或者CDLL.
ex CDLL("libc,so,6")
2.调用已加载库中的函数
继续阅读 »
tbox内置的libc库,有一份自有的printf实现,在支持了所有标准格式化参数的同时,也对其进行了一些扩展,来支持自定义的格式化参数打印, 例如:
```c
// 输出定点数:3.14
tb_printf("%{fixed}\n", tb_float_to_fixed(3.14));
// 输出ipv4地址:127.0.0.1
tb_ipv4_t addr;
tb_ipv4_set(&addr, "127.0.0.1");
tb_printf("%{ipv4}\n", &addr);
```
以上两种都是TBOX内置的对象参数打印,你只需要吧你需要打印的对象名和对象描述函数注册进来,就行了。
其中%{ob
继续阅读 »
tbox目前支持sqlite3、mysql两种关系型数据库(需要链接对应的libsqlite3.a和libmysql.a),并对其接口进行了封装,使用更加的方便简洁并且只需要换个url,就可以随时切换成其他数据库引擎,而不需要修改接口。
下面先看个简单的例子:
```c
/* 初始化一个mysql数据库
*
* localhost: 主机名,也可以是ip地址
* type: 数据库的类型,目前支持:mysql 和 sqlite3两种类型
* username: 数据库用户名
* password: 数据库用户密码
* databas
继续阅读 »
tbox内部提供了两种定时器实现:timer和ltimer
timer: 高精度版本,采用最小堆实现,复杂度是:O(log(n))
ltimer: 低精度版本,采用linux内核中的timing-wheel算法,复杂度是:O(1)
这里主要讲解下,如何使用timer实现高精度的定时器任务,精确到ms级别,对于低精度的ltimer,可以参考:低精度定时器的使用
下面先给个简单的例子来说明:
```c
/* 定义一个定时器任务处理函数
*
* @param killed 表示当前任务是否被tb_timer_task_kill强行kill掉的
* @param priv 投递任务时传入的用户自定义数据指针
*/
stat
继续阅读 »