`
coderplay
  • 浏览: 571387 次
  • 性别: Icon_minigender_1
  • 来自: 广州杭州
社区版块
存档分类
最新评论
文章列表
------------------ port 篇 ------------- open_port/2这个是由bif实现, 源文件在erl_bif_port.c中, 函数是BIF_RETTYPE open_port_2(BIF_ALIST_2) 其中: #define BIF_RETTYPE Eterm #define BIF_ALIST_2 Process* A__p, Eterm A_1, Eterm A_2 此函数调用了同文件中的 static int open_port(Process* p, Eterm name, Eterm settings, int *err_nump) 函数. ...
simple_one_for_one可以让supervisor的所有child都以相相同的处理步骤来动态加载child. ejabberd的ejabberd_tmp_sup就是此技巧的一例.
State用来存数据, 任何erlang term都行 gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}第一个参数表示本地(local方式)建立一个名为ch3的进程.第二个参数表示回调函数(比如handle_call, handle_cast)所在的模块.注意,前者是进程名,后者是模块名. 两个可以不一样. 进程是从程序结构方面来说的, 而模块是从目录结构这方面来说的.第一个参数可以省略成为start_link/3,此时进程不会注册名称,以pid代替. gen_server:start_link()是同步的, g ...
用pman 可以看出application controller 是一个gen_server实例, 由gen_server:loop/6执行相应的功能.  此进程注册名为application_controller
没哪放,放在这儿,做个记号 每条java线程都有它自己私有的栈, 这个栈在开启线程的同时就建立了.  栈会存一些frame.  java虚拟机的栈和c语言中的栈类似: 它存储本地变量, 部分结果, 且参与方法的调用和返回. opcode放在InstructionConstants类中
linux使用上百个双向链表来存储内核的各种数据结构, 其中包括进程描述符的task_struct结构. cpp 代码   struct list_head {       struct list_head *next, *prev;   };   在list.h中,形如__xxx的函数用来操作整个链表,而不是单个链表元素. 进程从pid得到进程描述符pd要一种高效的方法, 提到高效方法,那就用哈希表啦.  内核在这儿的哈希方法为一道宏, 表中有PIDHASH_SZ个元素(一般情况下PIDHASH_SZ=1024): cpp 代码   #defin ...
注: 此处节点是指分布式中分布在各终端的点, 而结点是指存在数据结构中的元素. 各结点组成一个链表 c 代码   typedef struct {     Node *reg;            /*已注册的结点链表*/     Node *unreg;          /*注销的结点链表*/     Node *unreg_tail;     /*注销链表尾*/     int unreg_count;      /*注销结点个数*/   } Nodes;   节点注册过程 1. 先看看注销链表中有没有些结点已经用过, ...

Tracing和dbg

代码不必用特殊的标记(比如debug_info)来编译,也可以trace. erlang:trace是最底层的BIF实现的trace功能。格式如下 erlang:trace(PidSpec,How,FlagList) 它要通过erlang:trace_pattern(MFA,MatchSpec,FlagList)来辅助输出. MatchSpec这东西很难写,在dbg模块中可以用dbg:fun2ms,它可以把函数转成MatchSpec. 比如: dbg:fun2ms(fun(_) -> return_trace() end). 相当于 [{'_',[],[{return_tra ...

emacs学习

    C-f   下一字符     C-b   上一字符     M-f    下一词     M-b   上一词     C-n   下一行     C-p    上一行     C-a    转到行头     C-e    转到行尾     M-a    转到句首     M-e    转到句尾     M-<    转到篇头     M->    转到篇末  Meta 字符经常用在对语言单元的操作(词,句, 段),  Control字符与你编辑的内容是什么无关,它编辑的是基本单元.(字符, 行,等). 大多数emacs命令都可以带一个数字参数n,表示执行 ...
ets与dets都是用来存大数据的机制 ets是Erlang term storage的缩写, dets则是disk ets. 它们不同的就是ets存在内存里面,而dets则存在磁盘上。 ets存的数据表是暂时性的,拥有它的进程挂了,它也会挂掉. dets就算程序完成或者挂了,数据表还是持久存在的.如果是异常退出的, 可以进行修复. ets表看起来像是由erlang实现的,但实际上它是由运行时系统实现的,所以具有更高的性能. 且有一个特性: ets表不会被垃圾回收! 操作 建表 ets:new和dets:open_file 插入 ets:insert(TableId, X ...
看了一篇文章,觉得用telnet来调试ejabberd也是一种好办法,同时可以明文看到服务器返回的xml. 先telnet上去  代码   # telnet 192.168.0.97 5222   Trying 192.168.0.97...   Connected to erlt97.3322.org (192.168.0.97).   Escape character is '^]'.   连接被接收啦,客户端发送 xml 代码   <?xml version='1.0'?>   <stream:stream  ...
转战到97机器。在ejabber.config加上这么一行.  这样就有管理权限了, {user, "admin", "192.168.0.97"},表示admin@192.168.0.97这个用户。   {acl, admin, {user, "admin", "192.168.0.97"}}.     在浏览器的地址栏输入http://192.168.0.97:5280/admin. 然后键入正确的用户名和密码。我这儿用户名是admin@192.168.0.97,密码是123456。 ...
这些天捣鼓了下ejabberd,准备研究它的代码,做为榜样~ 我这儿用的是1.1.3的代码,而svn上面的代码有些地方做了比较大的改动. 安装很简单 ./configure   make && make install   就ok了. ejabberd 会安装在var/lib/ejabberd目录, 配置文件在/etc/ejabberd目录,默认是ejabberd.cfg, 日志放在/var/log/ejabberd目录下. 若现在像ejabberd的指南所说的那样执行 erl -pa /var/lib/e ...

mnesia相关笔记

当前版本OTP 5.5的mensia建表的表名可以和记录名不一样. 代码 mnesia:create_table(t_employee, [{attributes, record_info(fields, employee)}]).   根据employee记录建立t_empolyee表
7 Applications This chapter should be read in conjunction with app(4) and application(3). 7.1 Application Concept When we have written code implementing some specific functionality, we might want to make the code into an application, that is a component that can be started and stopped as a unit, an ...
Global site tag (gtag.js) - Google Analytics