这GitHub上的5个C语言开源项目,你每天都在用!
作者 | 百家号 itworld123
如果大家详细的分析一下自己所从事过的项目,或者分析一下目前热门招聘岗位,就可以抽取一些公共的技术(或者基础技术),如果能熟练掌握这些基础技术,对开发工作将达到事半功倍的效果,同时对以后跳槽也有很大的帮助。如果本文直接说出这些技术概念,大家肯定非常清楚,但达到熟悉的程度确实难上加难。因此,本文搜集了目前比较流行的几个开源项目,这些项目中基本上包含了这些技术,如果大家能把这些开源项目学透,在以后的开发工作中将如鱼得水。
Redis
Redis的全称是REmote DIctionary Server,由Salvatore Sanfilippo写的key-value存储系统,更多的场景是作为数据库的前端缓存。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,其最大的特点是可以基于网络进行访问。虽然称为KV数据库,但Redis支持的值类型非常丰富,可以是字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类类型。
废话说了这么多,那么我们可以从这个开源项目学到什么内容呢?具体来说主要可以学习如下内容:
算法和数据结构:由于其支持如此之多的数据类型,除了常规的链表等数据结构外,还有调表、散列和集合等实现。由于其对性能的要求,因此在其实现的时候对数据结构和算法的应用达到了吹毛求疵的地步。网络编程:Redis实现了跨平台的支持,为了支持不同平台的网络编程,特别是异步编程模型。
Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。详细进行Web开发和运维的同学没有不知道Nginx的,它既可以做Web服务器,又可以做反向代理实现负载均衡。
Nginx的代码非常值得阅读,通过阅读其代码可以熟悉如下内容:
网络编程:可以熟悉网络编程及服务端异步框架模型。例如select、poll、epoll和kqueue等的使用方式。HTTP协议:属性HTTP协议的实现细节。插件架构:Nginx的扩展功能通过插件实现,阅读其代码可以了解插件的实现原理,插件机制在软件开发中应用广泛。
Leveldb或RocksDB
Leveldb是一个google实现的非常高效的kv数据库,RocksDB功能与其相同,但其内部做了很多完善和改进。两者都是在互联网领域应用广发的开源项目。
学习其源代码可以对如下领域有更加深入的理解:
网络编程:不过多介绍了磁盘数据存储:两者的目的都是实现一种高效的KV存储,因此对磁盘的访问及数据组织都费了很多心思,以保证其性能的最大化。数据结构:前面几个开源想更多的是在内存中的数据结构,但对于磁盘数据的存储却没有任何优势。LevelDB和RocksDB中对磁盘数据存储和读取有其独特的数据结构。阅读其代码可以让我们在数据结构的另外一个领域大开眼界。
SQLite
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQlite的代码量才1万行左右,去掉注释后5千多行,代码量不大,注释丰富,非常适合学习。
阅读其代码可以对关系型数据库的实现细节有深入的了解。特别是数据的组织、磁盘访问和数据一致性的保证等。
Tinyhttpd
Nginx的代码量是比较大的,几万行的代码阅读起来可能比较吃力。如果想了解HTTP协议的具体实现,由不太敢阅读Nginx的代码怎么办?正好有个替代方案,那就是tinyhttpd,它是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。
好了,先介绍到这,相信还有很多值得学习的开源项目,这里就不一一介绍了。