分享10个适合初学者学习的C开源项目代码

1.Webbench

Webbench 是一个在 linux 下使用的非常简单的网站压测工具。它使用 fork ()模拟多个客户端同时访问我们设定的 URL,测试网站在压力下工作的性能,最多可以模拟 3 万个并发连接去测试网站的负载能力。Webbench 使用C语言编写, 代码实在太简洁,源码加起来不到 600 行。

下载链接:

http://home.tiscali.cz/~cz210552/webbench.html

2. Tinyhttpd

tinyhttpd 是一个超轻量型 Http Server,使用C语言开发,全部代码只有 502 行(包括注释),附带一个简单的 Client,可以通过阅读这段代码理解一个 Http Server 的本质。

下载链接:

http://sourceforge.net/projects/tinyhttpd/

3. cJSON

cJSON 是C语言中的一个 JSON 编解码器,非常轻量级,C文件只有 500 多行,速度也非常理想。

cJSON 也存在几个弱点,虽然功能不是非常强大,但 cJSON 的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。

项目主页: 

http://sourceforge.net/projects/cjson/

4. CMockery

cmockery 是 google 发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。cmockery 的源代码行数不到 3K,你阅读一下 will_return 和 mock 的源代码就一目了然了。

主要特点:

免费且开源,google 提供技术支持; 

轻量级的框架,使测试更加快速简单; 

避免使用复杂的编译器特性,对老版本的编译器来讲,兼容性好; 

并不强制要求待测代码必须依赖 C99 标准,这一特性对许多嵌入式系统的开发很有用 

下载链接:

http://code.google.com/p/cmockery/downloads/list

5. Libev

libev 是一个开源的事件驱动库,基于 epoll,kqueue 等 OS 提供的基础设施。其以高效出名,它可以将 IO 事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于 Reactor 模式,效率较高,并且代码精简(4.15 版本 8000 多行),是学习事件驱动编程的很好的资源。

下载链接:

http://software.schmorp.de/pkg/libev.html

6. Memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态数据库驱动网站的速度。Memcached 基于一个存储键/值对的 hashmap。Memcached-1.4.7 的代码量还是可以接受的,只有 10K 行左右。

下载地址:

http://memcached.org/

7. Lua

Lua 很棒,Lua 是巴西人发明的,这些都令我不爽,但是还不至于脸红,最多眼红。

让我脸红的是 Lua 的源代码,百分之一百的 ANSI C,一点都不掺杂。在任何支持 ANSI C 编译器的平台上都可以轻松编译通过。我试过,真是一点废话都没有。Lua 的代码数量足够小,5.1.4 仅仅 1.5W 行,去掉空白行和注释估计能到 1W 行。

下载地址:

http://www.lua.org/

8. SQLite

SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的 SQL 数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。足够小,大致 3 万行C代码,250K。

下载地址:

http://www.sqlite.org/ 。

9. UNIX v6

UNIX V6 的内核源代码包括设备驱动程序在内约有 1 万行,这个数量的源代码,初学者是能够充分理解的。有一种说法是一个人所能理解的代码量上限为 1 万行,UNIX V6 的内核源代码从数量上看正好在这个范围之内。看到这里,大家是不是也有“如果只有 1 万行的话没准儿我也能学会”的想法呢?

另一方面,最近的操作系统,例如 Linux 最新版的内核源代码据说超过了 1000 万行。就算不是初学者,想完全理解全部代码基本上也是不可能的。

下载地址:

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V6

10. NETBSD

NetBSD 是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统,可以在许多平台上执行,从 64bit alpha 服务器到手持设备和嵌入式设备。NetBSD 计划的口号是:”Of course it runs NetBSD”。它设计简洁,代码规范,拥有众多先进特性,使得它在业界和学术界广受好评。

由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。许多程序都可以很容易地通过 NetBSD Packages Collection 获得。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

a8766be5e0c6b3a5e336c7a068642f44.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat与tomee_Apache TomEE(和Tomcat)的自签名证书

tomcat与tomee可能在大多数Java EE项目中,您将拥有具有SSL支持( https )的部分或整个系统,因此浏览器和服务器可以通过安全连接进行通信。 这意味着在处理数据之前,已发送的数据已加密,传输并最终解密。 …

linux环境变量管理器,运维 - linux(ubuntu) 环境变量管理 (持续更新)

运维 - linux(ubuntu) 环境变量管理 (持续更新)注: 本教程以 Ubuntu16.04 操作, 请细看. 如果看完还不明白, 联系我, 我给你发红包.一, 查看环境变量:方法 1: 直接用 $PATH 命令:wafaubuntu:~$ $PATHbash:/home/king/bin:/home/king/.local/bin:/usr/local/sbin:/usr/local/bin…

C 线程的使用~(上)

C 11 之前,C 语言没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在 C 11 中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大…

k8s中graphite_在Graphite中存储Hystrix的几个月历史指标

k8s中graphiteHystrix的杀手级功能之一是低延迟,数据密集和美观的仪表板 : 即使这只是Hystrix实际操作的副作用(断路器,线程池,超时等),它也往往是最令人印象深刻的功能。 为了使其工作&#…

linux下gate版本管理,Linux安装使用GoldenGate

如何安装使用goldengate一.环境:OS:linux CentOS_Final_5.5(64bit)DB:oracle11gR2(单机模式)goldengate: ggs_Linux_x64_ora11g_64bit_v11_1_1_0_0_078.tar网络:局域网,源端IP 192.168.128.100 镜像端IP 192.168.128.101二&…

C语言中的“三字母词”坑了工程师

某软件工程师接盘了前同事的项目,进度一拖再拖,最后发现问题出现在如下代码:// 注释语句 ??/2a b c;请注意代码中的“??/”,就是这注释隐藏的很深,让项目一拖再拖。"??/"会被编译器当作 /&#xff0c…

guice 实例_使用Google Guice消除实例之间的歧义

guice 实例如果接口有多个实现,则Google guice提供了一种精巧的方法来选择目标实现。 我的示例基于Josh Long ( starbuxman )的出色文章,内容涉及Spring提供的类似机制。 因此,请考虑一个名为MarketPlace的接口&#…

linux uboot 源码分析,UBoot源码分析1.pdf

UBoot源码分析1• UBoot源码解析(一)主要内容• 分析UBoot是如何引导Linux内核• UBoot源码的一阶段解析BootLoader概念• Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而…

C 线程的使用~(下)

2.3 detach()detach() 函数的作用是进行线程分离,分离主线程和创建出的子线程。在线程分离之后,主线程退出也会一并销毁创建出的所有子线程,在主线程退出之前,它可以脱离主线程继续独立的运行,任务执行完毕之后&#x…

javafx有布局管理器吗_JavaFX技巧17:带有AnchorPane的动画工作台布局

javafx有布局管理器吗最近,我不得不为应用程序实现一个布局,其中可以根据用户是否登录来隐藏或显示菜单区和状态区,并通过滑入/滑出动画显示该区域。 以下视频显示了实际的布局: 过去,我可能会使用自定义控件和自定义…

linux双wan网关负载均衡,Csico2951路由器,如何做到双WAN口负载均衡?

Router2800(config-if)#ip addressY.Y.Y.Y 255.255.255.252(Y为移动地址)Router2800(config-if)#ip nat ouosideRouter2800(config-if)#no shutdownRouter (config)#ip dns serverRouter (config)#ip name-server A.A.A.A B.B.B.B(A为电信解析地址,B为移动解析地址)…

用c语言编写爱心的代码是什么

用c语言编写爱心的代码&#xff1a;输入完整代码如下&#xff1a;#include int main(void){float a,x,y;for(y1.5f; y>-1.5f; y-0.1f){for(x-1.5f; x<1.5f; x 0.05f){a x*x y*y-1;char ch a*a*a-x*x*y*y*y<0.0f?*: ; putchar(ch); }printf("\n");}retur…

c++ lambda 重载_您会后悔对Lambdas应用重载!

c lambda 重载编写好的API很难。 非常辛苦。 如果您希望用户喜欢您的API&#xff0c;则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡&#xff1a; 用处 易用性 向后兼容 前向兼容性 之前&#xff0c;在我们的文章&#xff1a; 如何设计良好的常规API中&#xf…

linux1到10累加,10个有趣的 Linux 命令

在终端工作是一件很有趣的事情。今天&#xff0c;我们将会列举一些有趣得为你带来欢笑的Linux命令。1. rev创建一个文件&#xff0c;在文件里面输入几个单词&#xff0c;rev命令会将你写的东西反转输出到控制台。# revSelection_002Selection_0012. fortune这个命令没有被默认安…

7个华为关于C语言的经典面试题

1、找错void test1(){ char string[10]; char* str1"0123456789"; strcpy(string, str1);}这里string数组越界&#xff0c;因为字符串长度为10&#xff0c;还有一个结束符’\0’。所以总共有11个字符长度。string数组大小为10&#xff0c;这里越界了。PS&am…

java8 函数式编程_Java 8函数式编程:延迟实例化

java8 函数式编程单例通常会延迟实例化自己&#xff0c;有时&#xff0c;如果对象足够重&#xff0c;则可以延迟实例化类字段。 通常&#xff0c;在走惰性路线时&#xff0c;getter方法&#xff08;或accessor &#xff09;必须具有一段代码&#xff0c;该代码块在返回对象之前…

linux数组操作 增删改查,linuxea:go数组与数组增删改查(19)

复合数据类型是集合类&#xff0c;并且可以存储多个单值。在golang中存储的数组是相同的数据类型&#xff0c;并且长度也是其中的一个属性。在go中&#xff0c;数组的长度一旦定义&#xff0c;就不可变。如果声明了长度的变量&#xff0c;只能赋值相同的长度的数组数组是具有相…

C语言的特点与创建的基本步骤是什么

C语言的特点与创建的基本步骤是&#xff1a;C 语言特点&#xff1a;1.C语言是一种成功的系统描述语言&#xff0c;用C语言开发的UNIX操作系统就是一个成功的范例;2.同时C语言又是一种通用的程序设计语言&#xff0c;在国际上广泛流行。世界上很多著名的计算公司都成功的开发了不…

谷歌guava_Google Guava:您永远不会知道的5件事

谷歌guava每个开发人员可以使用哪些鲜为人知的Google Guava功能&#xff1f; 它是那里最受欢迎的库之一&#xff0c;它是开源的&#xff0c;您可能已经知道了&#xff0c;它来自人们玩Quidditch作为一项真正的运动的地方&#xff08;至少在The Internship上 &#xff09;。 它…

c语言中prime的作用,C语言判断素数prime

《C语言判断素数prime》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言判断素数prime(2页珍藏版)》请在人人文库网上搜索。1、主函数&#xff1a;#include int prime();void main()int number;int flag;printf (请输入一个大于1的整数:);scanf (%d,&number)…