APR源代码分析-进程篇
Apache Server的进程调度一直为人所称道,Apache 2.0推出的APR对进程进行了封装,特别是Apache 2.0的MPM(Multiple Process Management)框架就是以APR封装的进程为基础的,下面就让我们一起来探索一下APR的进程封装吧(以Unix平台为例)。 ...
Apache Server的进程调度一直为人所称道,Apache 2.0推出的APR对进程进行了封装,特别是Apache 2.0的MPM(Multiple Process Management)框架就是以APR封装的进程为基础的,下面就让我们一起来探索一下APR的进程封装吧(以Unix平台为例)。 ...
作为一个可移植的运行时环境,APR的设计当然是很精妙的,但精妙的同时对使用者有一些限制。 APR附带一个简短的设计文档,文字言简意赅,其中很多的设计思想都值得我们所借鉴,主要从三个方面谈。 1、类型 1) APR提供并建议用户使用APR自定义的数据类型,好处很多,比如便于代码移植,避免数据间进行不必要的类型转换(如果你不使用APR自定义的数据类型,你在使用某些APR提供的接口时,就需要进行一些参数的类型转换);自定义数据类型的名字更加具有自描述性,提高代码可读性。APR提供的基本自定义数据类型包括: typedef unsigned char apr_byte_t; typedef short apr_int16_t; typedef unsigned short apr_uint16_t; typedef int apr_int32_t; typedef unsigned int apr_uint32_t; typedef long long apr_int64_t; typedef unsigned long long apr_uint64_t; 这些都是在apr.h中定义的,而apr.h在UNIX平台是通过configure程序生成的,在不同平台APR自定义类型的实际类型是完全有可能不一致的。 ...
由于部门所使用的底层库与Apache Server有着“一定的渊源”,所以总有一种想看看Apache的实现的冲动。最近项目收尾,愿望终可实现。 一、何为APR? Apache Server经过这么多年的发展后,将一些通用的运行时接口封装起来提供给大家,这就是Apache Portable Run-time libraries, APR。 ...
类型表示(representation of types) 1、一般规则 a) 除了位域(bit field)之外的对象都是由一个或多个相邻序列字节组成的,这些字节的个数(number)、次序(order)和编码方式或是显式说明的,或是实现定义的。 ...
翻看以前的一次jjhou的“高阶C”课程的ppt,突然想到今天指导新员工时,她犯的关于参数传递方面的错误,就想简单分析一下。 一、现象和经验 规则:任何时候你想在函数内修改某个外面的变量值,并影响Caller,你应该传递该变量的地址进去。如果是指针变量,也不例外。 ...
今天是牛郎和织女见面的日子,而我的织女因学校放假早已回家去了,剩下我这个孤独的牛郎只能“胡思乱想”,遂有了这篇blog。^_^ 感悟一:今早早起,翻来覆去睡不着,想起昨晚和一大学哥们的谈话,他曾经和老外交流过,老外的想法是“中国人总是把自己的一辈子都想好,然后在按部就班的去工作生活;老外则是走一步算一步。”,对照自己最近的想法,好像有些不谋而合,这个老外挺有思想。 ...
部门最近在进行C培训,由于有一个新员工需要我来指导,所以看了一下培训用的ppt,了解一下新员工的学习进度,恰看到ppt中有关“如何读懂复杂C声明”的章节。遂想起来自己在看《C专家编程》时,这块儿看得并不是很深刻,万一新员工问到我这块儿…,我不能打没有准备之仗,遂恶补之。 复杂的C声明一般被认为不是很好的编程习惯,当然也就不推荐使用。但是在读很多前辈遗留的代码时,又不得不面对这一问题。知道总比不知道好,我们还是来看看分析复杂C语言声明的规则吧,用例子分析最直观。 ...
在最近的项目中,我们涉及到了“内存对齐”技术。对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。 一、内存对齐的原因 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 ...
类型(type) 1、类型分为: a) object type — types that fully describe objects b) function type — types that describe functions c) uncomplete type — types that describe objects but lack information needed to determine their sizes,如void 2、在C99中加入了布尔类型_Bool,其定义为大小足够容纳0和1的类型。检查一下手头的编译器发现GCC 3.4.3支持_Bool,而Microsoft C/C++ Version 12.00.8168(VC6.0)则不支持。 ...
标识符(identifier) 1、一个标识符可以表示: a) 对象(object) b) 函数(function) c) 结构体(struct)的标签(Tag)[注1] d) 结构体的成员 e) 联合体(union)或枚举类型(enumeration) f) 类型别名(typedef) g) 标签(label) h) 宏(macro) i) 宏参数(macro parameter) 同一个标识符在程序的“不同点”处可以表示不同的“实体”(entity)。[注2] 一个枚举(enumeration)的成员被称为一个“枚举常量,enumeration constant”。 ...