随笔分类 -  C

摘要:这部分的代码出自《深入理解计算机系统》(CS:APP)第五章,其目的是通过手工改变代码结构,而不是算法效率和数据结构优化,提高执行效率。有些编译器在某些优化选项下可能会做出类似的改动。为了便于以后的查阅和使用,本文进行了摘录和简要分析,其中包含了一些个人理解。 阅读全文
posted @ 2014-04-10 17:43 五岳 阅读(2852) 评论(1) 推荐(0) 编辑
摘要:本文介绍如何编写一个简单的make而非如何编写makefile。通过分析makefile的格式提取其中的文件依赖的处理并存放到数据结构,简单介绍了make使用的时间戳,并使用DFS完成是否存在环和是否需要重新编译的判断,从而提供make的基本功能。源代码已托管至github。 阅读全文
posted @ 2013-11-22 17:34 五岳 阅读(2509) 评论(0) 推荐(4) 编辑
摘要:本文一步一步地教你如何编写一个具有基本功能的shell,特点是由简单到复杂,逐步添加新的特性,注重思路的展示而不是代码的堆砌,因而不会直接呈现一个完善的版本;同时练习相关的Linux的API,有助于破除对shell的神秘感。源码托管在:https://github.com/vvy/wshell 阅读全文
posted @ 2013-11-03 12:58 五岳 阅读(82129) 评论(23) 推荐(17) 编辑
摘要:本文是在找工作的准备过程中关于位运算的一些积累和记录的整理。 阅读全文
posted @ 2013-10-10 22:19 五岳 阅读(7013) 评论(1) 推荐(4) 编辑
摘要:wrieshark sudo yum install wireshark-gnome sudo wireshar (以root启动,否则看不到网卡)网站URL格式 以查询lumia为例 google http://www.google.com/search?q=lumia baidu http://www.baidu.com/s?wd=lumia tb http://s.taobao.com/search?q=lumia 亚马逊 http://www.amazon.cn/s/keywords=lumia 当当 http://search.dangdan... 阅读全文
posted @ 2013-10-02 11:39 五岳 阅读(782) 评论(0) 推荐(0) 编辑
摘要:以《C程序设计语言》(K&R)为主线,把《C语言参考手册》和C99标准作为参考和补充,同时考虑到自身平台,对常见的C语言编程细节进行测试和总结,尽量不涉及过于边缘的内容,力图简洁并正确。 阅读全文
posted @ 2013-09-13 17:03 五岳 阅读(7976) 评论(8) 推荐(3) 编辑
摘要:以HelloWorld为基础,修改为读取nginx.conf配置项并输出的程序,理清在读取配置项时,存储结构ngx_http_mytest_conf_t、初值生成方法create_loc_conf()、解析方法数组ngx_command_s[]和合并方法merge_loc_conf()的原理和联系。 阅读全文
posted @ 2013-08-14 21:50 五岳 阅读(4026) 评论(2) 推荐(3) 编辑
摘要:最近在读陶辉的《深入理解Nginx》,一是可以跟着大牛练练阅读和编写开源代码的能力,二是想学学Nginx优秀的架构设计,三是想找一个点深入下Linux环境下网络编程的细节。读书的时候自然少不了实际地动手,这个系列的博文是对学习过程的梳理和动手过程的补充。原书对实践中一些已提及的细节问题不再赘述。 阅读全文
posted @ 2013-08-13 20:22 五岳 阅读(8873) 评论(4) 推荐(3) 编辑
摘要:问题来自于《程序员面试宝典(第三版)》第12.2节面试例题9,主要是结合原书代码和解析,讨论malloc(0)的行为,对原书没说清的地方进行补充。 阅读全文
posted @ 2013-07-27 16:07 五岳 阅读(23197) 评论(15) 推荐(4) 编辑
摘要:位向量/位图是一个很有用的数据结构,在充分利用小空间存储大量数据方面非常具有优势,Linux内核中很多地方都是用了位图。同时,它不但基础,而且用到了很多编程语言的知识,以及对细节的把握,常常作为面试题出现。这里将要介绍它的实现、操作、应用。 与位图(bitmap)比,我更倾向于用位向量(bit ve 阅读全文
posted @ 2013-06-24 16:42 五岳 阅读(9561) 评论(5) 推荐(5) 编辑
摘要:前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错://对于一个2行13列int元素的二维数组//函数f的形参形式f(int daytab[2][13]) {...}//以下两种可以忽略行数f(int daytab[][13]) {...}f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略第一维,其他维不能省略。然而你对这种形式并不满意:如果事先限定了二维数组的大小,函数的泛用性就要大打折扣了。因为你真正需要的,是可以处理事先未知行数和列数的二维数组的函数。当然也有文章提到类似下面的动态分配的方式,但作为函数参数传递有.. 阅读全文
posted @ 2013-06-14 17:15 五岳 阅读(42386) 评论(9) 推荐(17) 编辑
摘要:提示:本文是一篇个人读书笔记,并不是对原书内容的系统总结整理,除了两处标红部分,可能对作者以外的读者没有太大的参考意义。 每条准则都有例外第1章 假想的编译程序使用编译程序所有可选警告设施在使用nginx时深切地体会到了这一点的好处:有一行语句在编码时漏掉了,由于这个语句是唯一使用某个变量的地方,而且默认开启了-Werror=unused-value,才发现了这个错误。使用函数原型来检查参数(现在不使用也可以);必要的空语句用NULL代替,以防while()后多打的分号造成的bug相等判断反着写以防写成赋值:'t' == char使用lint来查出编译程序漏掉的错误如果有单元测 阅读全文
posted @ 2013-05-31 21:48 五岳 阅读(760) 评论(0) 推荐(0) 编辑
摘要:用于内存管理的malloc/free这对函数,对于使用C语言的程序员应该很熟悉。前段时间听说有的IT公司以“实现一个简单功能的malloc”作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下。毕竟把题目做出来是次要的,了解实现思想、提升技术才是主要的。本文主要是对malloc/free实现思路的介绍,蓝色部分文字是在个人思考中觉得比较核心的东西;另外对于代码的说明,有一些K&R上的解释,使用绿色加亮。 在研究K&R第八章第七节的实现之前,不妨先看看其第五章第四节的alloc/afree实现,虽然这段代码主要目的是展示地址运算。alloc实现#d 阅读全文
posted @ 2013-05-03 21:09 五岳 阅读(10762) 评论(4) 推荐(9) 编辑
摘要:前言: 这算是第二次系统地阅读UNPv1,正如副标题,不希望写成书摘、缩写版,尽量多写写个人体会和获得的经验,因此很多地方都会从全书的角度来说明,而不仅仅限于某个章节内部。 SCTP、信号驱动I/O、广播和多播等内容不包括在内。准备工作: 为了适应在命令行界面编写代码,我先进行了vim环境的配置和Xshell的配置。在读书过程中还学习了gdb调试程序的方法(见这里)。(1)vim插件搭建 从别人那里拷贝现成的的.vimrc和插件,分别放于/home/用户名 和/home/用户名/vim文件夹下就行了。(2)Xshell远程登录 下载安装Xshell。由于是用VMware装的Ubu... 阅读全文
posted @ 2013-03-31 17:36 五岳 阅读(1323) 评论(0) 推荐(0) 编辑
摘要:这几天照着UNP上提供的ping源码编写了一个用来学习。虽然编译后能运行,但由于使用了原始套接字,必须root权限运行,这与和Linux下真实的ping有差别:后者是不需要输入sudo或者切换到#才能运行的。linux中的ping源码没有找到,但是看到oschina上有一例自制的ping源码相似,作者提供的示意图中在$提示符下没有用sudo运行的。总之,希望能够使自己编写的程序以root权限运行而不需要加上sudo或者切换到#提示符。 没有找到能在进程运行时提升自身权限的方法,另查到一种方法(来源见文后注释)可以实现,这两步缺一不可:(1)用root权限完成gcc;(2)chmod u+... 阅读全文
posted @ 2013-03-31 15:35 五岳 阅读(1589) 评论(0) 推荐(0) 编辑
摘要:本文主要参考自:http://www.cnblogs.com/zzx1045917067/archive/2012/12/26/2834310.html,进行了一点补充和编排;Core dump部分参考了:http://blog.ddup.us/?p=176。 gdb是一个在UNIX环境下的命令行调试工具。 如果需要使用gdb调试程序,请在gcc时加上-g选项。 下面的命令部分是简化版,比如使用l代替list等等。1.基本命令1)进入GDB #gdb test test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。2)查看源码 ... 阅读全文
posted @ 2013-03-29 08:29 五岳 阅读(71881) 评论(2) 推荐(4) 编辑
摘要:距离上一篇中间时间比较长,按照《算法导论》写了一些C语言实现,不过并没有一一贴上来的打算。这个算法融合了Bellman-Ford算法和Dijkstra算法,并且Dijkstra算法本身还使用了优先级数组(可用二项堆或斐波那契堆实现,这里用的是二项堆实现),性能比较好,达到了O(V2lgV+VE)的时间复杂度,在无负权回路图中是最快的,比较有代表性,因此把我参考自《算法导论》写成的C代码放在这里留档。 这个算法不是对二者的简单融合,其中的重赋权值有理论依据,此处略去,可以参考原书。算法步骤简述:1.计算图G加入新结点后的图G’,加入的新结点0到所有原结点之间距离为0,同时形成新的边集E' 阅读全文
posted @ 2012-11-16 22:39 五岳 阅读(2730) 评论(3) 推荐(0) 编辑
摘要:(学习的主要对象是《算法导论》上B-树章节)应用环境: 辅存和主存的矛盾,主存只能维持有限的页数,其他页存于辅存上,使用时调入内存。B树的定义: 是一个具有如下性质的有根树: (1)每个结点x有以下域: (a)n[x],存放结点x的关键字数; (b)n[x]个关键字本身,以非降序存放; (c)leaf[x],1代表x是叶子,0代表x是内结点。 (2)每个内结点包含n[x]+1各指向其子女的指针。叶结点对这个域没有定义。 (3)各关键字对其各子树关键字范围进行分隔。 (4)每个叶结点深度相同。 (5)每个结点包含的关键字有上界和下界,用t表示最小度数,则有 ... 阅读全文
posted @ 2012-10-23 11:45 五岳 阅读(429) 评论(0) 推荐(0) 编辑
摘要:(学习的参考资料主要是《算法导论》。) 首先是红黑树的性质。一棵二叉查找树满足以下的红黑性质,则为一棵红黑树。 1)每个结点或是红的,或是黑的。 2)根结点是黑的。 3)每个叶结点(NIL)是黑的。 4)红结点的两个孩子都是黑的。 5)对任意结点,从它到其子孙结点所有路径上包含相同数目的黑结点。 初学时并不在意,但是仔细研究相关算法就会知道,算法都是围绕保持这些性质来进行的。性质5)保证了红黑树使用时的高效。定理证明了n个内结点的红黑树高度至多为2lg(n+1)。 不同于一般二叉查找树,红黑树一般采用一个哨兵结点代表NIL,这对算法的使用提供了很多方便,具体编写时可以体会的到。... 阅读全文
posted @ 2012-09-28 17:12 五岳 阅读(495) 评论(0) 推荐(0) 编辑
摘要:接上一篇,能正确启动内核线程,就可以进行进一步的使用了。这里介绍下更改内核线程调度策略和优先级的方法。 个人理解,内核级线程和进程是一样的,前者与POSIX线程(pthread)有很大的区别。因此,内核的进程调度策略和系统调用也适用于内核级线程。 调度策略有三种: 1.SCHED_NORMAL 非实时调度策略,默认情况下是100~139,由nice值决定; 2.SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于... 阅读全文
posted @ 2012-07-04 15:54 五岳 阅读(4061) 评论(0) 推荐(0) 编辑

回到顶部