2012年12月28日
摘要: erlang的启动引导部分代码,本文章讲解的是排除C源码,从erlang代码开始的部分,C代码部分以后补充,otp_ring0:start/2为第一个函数调用,源码内容很简单,我就不贴出来了,就是一个调用init:boot/0的功能。接下来,我们分析init:boot/0的流程init() -> register(init, self()),%将本进程注册为init进程 process_flag(trap_exit, true), start_on_load_handler_process(), %spawn一个?ON_LOAD_HANDER进程,但并没有link {S... 阅读全文
posted @ 2012-12-28 11:50 文武双全大星星 阅读(542) 评论(0) 推荐(0) 编辑
2012年12月27日
摘要: 这个启动脚本默认是在$ROOT/bin/start.boot文件,所以我们查看一下相应的start.script文件,内容如下%% script generated at {2012,11,27} {19,37,10}{script, {"OTP APN 181 01","R15B03"}, [{preLoaded, [erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip, zlib]}, {progress,preloaded}, {path,["$... 阅读全文
posted @ 2012-12-27 17:27 文武双全大星星 阅读(669) 评论(0) 推荐(0) 编辑
2012年12月26日
摘要: 关于erl的启动参数主要分为emulator flags,flagsandplain argumentsemulator flags:以‘+’开头的启动参数,如+P, +W等用于控制模拟器的行为。flags:以'-'开头的启动参数,如-sname, -boot等,这些需要被传递给ert中的init模块进行解析处理。plain arguments:没有详细的定义,基本就是除了以上emulator flags,和flags,其他的都属于此类。用户自定义的flag, 在init对arguments的解析过程中进行解析和存储。模拟器flag主要控制emulator的行为或者配置,这部分 阅读全文
posted @ 2012-12-26 15:43 文武双全大星星 阅读(1067) 评论(0) 推荐(0) 编辑
2012年12月25日
摘要: 最近clone了一个开源项目最新版本,代码启动的时候总是报错,超纠结,以前没这问题啊= =查看了源码错误是在erlang:function_exported(xx, xx, 0)这个函数位置。代码的执行依赖于这个函数的返回,API对此函数的说明是:Returnstrueif the moduleModuleis loaded and contains an exported functionFunction/Arity; otherwisefalse.但明明模块是有这个导出函数的啊,然后我在控制台再次手工调用了一次这个方法,显示结果是true。第一次调用时返回false,第二次调用时返回tru 阅读全文
posted @ 2012-12-25 15:44 文武双全大星星 阅读(244) 评论(0) 推荐(0) 编辑
2012年12月19日
摘要: cowboy是一个用erlang编写的简洁,快速的http server,代码质量很高。最新版本的代码貌似把原先的网络层socket pool剥离出来,做成了一个新的项目ranch。所以首先我们先来分析一下ranch。分析ranch代码首先必须明确三个关键概念:Listeners:A listener is a set of processes whose role is to listen on a port for new connections. It manages a pool of acceptor processes, each of them indefinitely acce 阅读全文
posted @ 2012-12-19 14:25 文武双全大星星 阅读(525) 评论(0) 推荐(0) 编辑
2012年12月17日
摘要: 该模块主要用于gen模块中同步和异步创建进程翻开源码,就会发现最底层实际就对是erlang模块中几个spawn相关的bif做了一层代理。而proc_lib:sync_wait/2 和proc_lib:init_ack/1,2在初始化时的配对使用,又为上层提供了同步初始化的功能。添加这层封装,主要目的在于,在进程初始化的过程中往进程字典中注入一些我们感兴趣的信息。1.累积'$ancestor'字段, 基本就相当于进程树的祖先节点了,这是一个list。2.添加'$initial_call'字段, 字面意思也知道是初始化调用函数了。而进程字典中的这些信息, 在进程初始 阅读全文
posted @ 2012-12-17 11:19 文武双全大星星 阅读(219) 评论(0) 推荐(0) 编辑
2012年12月14日
摘要: error logger本质上是一个事件管理器 (gen_event),可以根据需求绑定替换新的事件处理器。只需要几条特定的几条message进行处理,就可以方便的扩展一个error_logger事件处理器。error_logger进程启动后,默认绑定一个error_logger的handler。这里有一个细节就是group_leader的概念(后面我会写篇文章详细介绍),error_logger默认处理器同时将事件传递到group_leader所在的节点上,这样就隐藏了本地和跨节点log的细节。在stdlib中有两个模块error_logger_tty_h和error_logger_file 阅读全文
posted @ 2012-12-14 09:55 文武双全大星星 阅读(704) 评论(0) 推荐(0) 编辑
2012年12月12日
摘要: 我记得mochiweb的源码里貌似使用过这种parameterized module.虽然不知道erlang的底层实现,但感觉上就是个语法糖,首先建立文件people_oo.erl-module(people_oo, [Name, Age]).这里的Name,Age的作用域相当于整个module,这时查看people_oo:module_info(export): [{new, 2}, {instance,2},{module_info,1}, {module_info,2}],比这正常的module多了两个函数 new/2 instance/2,其实如果把这个module看成一个class. 阅读全文
posted @ 2012-12-12 12:28 文武双全大星星 阅读(465) 评论(0) 推荐(0) 编辑
2012年12月11日
摘要: 正在研究lager的源码,但是对parse_transform的机制不太了解,查了一些文档,做了下测试,就有了这篇日志。首先我们要明确erlang中Abstract Format的概念,这个我就不重复了,大家可以直接http://erlang.org/doc/apps/erts/absform.html根据Asf你可以具有类似lisp的s-expression那种强大的元编程能力,提供一些语法糖等等……parse_transform 机制在我看来,就是一个的暴露出来的钩子,允许你在erlang代码编译之前,根据Asf的解析,进行注入修改等操作。下面做个简单的代码修改的例子:parse_tran 阅读全文
posted @ 2012-12-11 19:00 文武双全大星星 阅读(1380) 评论(0) 推荐(0) 编辑