- 浏览: 32916 次
- 性别:
- 来自: 北京
最新评论
-
liumengfan:
{beam_dynamic_libraries, get_dy ...
system_info模块 -
liumengfan:
{environment, [split_env( ...
system_info模块 -
liumengfan:
其中{environment_erts, os_getenv ...
system_info模块 -
liumengfan:
centos再安装erlang之前,先安装如下软件:yum i ...
SystemTap and Erlang: a tutorial -
liumengfan:
判断是否是内部port的程序:#define is_inter ...
erlang判断内部pid的方法
文章列表
在看了霸爷的erlang的abstract code之后,自己动手实验了一下,效果如下:
[liufan@liufan abstract_code]$ erl -s hello -s erlang halt
Erlang R16B01 (erts-5.10.2) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
"hello world"
[liufan@liufan abstract_code]$ cat hello.erl
-module(hello).
...
今天实验了一下霸爷博客里的CPU密集型计算,
计算的内容时计算四遍斐波纳妾数列的第四十个元素是多少
代码如下:
cpu_intensive.erl
-module(cpu_intensive).
-compile([export_all]).
fib_test() ->
fib(40),
fib(40),
fib(40),
fib(40),
fib(40).
...
在erl_term.h文件里:
#define _TAG_IMMED1_PID ((0x0 << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_IMMED1)
#define _TAG_PRIMARY_SIZE 2
#define TAG_PRIMARY_IMMED1 0x3
由上面得到_TAG_IMMED1_PID=0x3(0000 0000 0000 0000 0000 0000 0000 0011)
而判断是否是内部pid的定义是:
#define is_internal_pid(x) (((x) & _TAG_IMMED1 ...
今天编译erlang自带的ei_interface的例子时,报错如下
[liufan@liufan src]$ gcc -o extprg -I/usr/local/lib/erlang/lib/erl_interface-3.7.13/include/ -L/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib complex.c erl_comm.c ei.c -lerl_interface -lei
/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib/libei.a(ei_pthreads ...
下面引用霸爷的话,给自己做一个笔记
引用inet_drv内部每个socket都有个消息队列, 保持着上层推来的消息. 这个消息队列有上下水位线的. 当消息的字节数目超过了高水位线的时候, inet_drv就把socket标志为busy. 这个busy要到队列的字节数少于
低水位线的时候才解除.
这是未公开的文档,用法参见下面:
inet:setopts(Socket, [{high_watermark, 131072}]).
inet:setopts(Socket, [{low_watermark, 65536}]).
今天再erlang inline 编译中读到erlang的函数也可以内联编译。
但是内联功能从来不会默认打开的。如果想使用的话,必须显示的在代码里使用-compile()属性。
当再代码里加上-compile(inline).时,编译器会根据自己的规则来决定哪个函数被定义成内联函数,其中有一个因素就是-compile({inline_size, Size}).,默认的size是24,这个size作为一个权重来参与决定某个函数是否被编译成内联的函数。
我们也可以使用
-compile({inline, [test/0, start/1]}).
或者
-compile({inline, [{test ...
今天读到褚霸博客里的gen_tcp:send的深度解刨和使用指南(初稿)时,顺着霸爷的思路,跟着
lib/kernel/src/gen_tcp.erl
send(S, Packet) when is_port(S) ->
case inet_db:lookup_socket(S) of
{ok, Mod} ->
Mod:send(S, Packet);
Error ->
Error
end ...
今天读到http://blog.yufeng.info的gen_tcp:send的深度解刨和使用指南(初稿),看到下面这句:
引用
gent_tcp:send的时候数据的格式是iolist. 很多人会误会,特地把iolist特地变成list或者binary. 新生成的binary或者list在send之后要GC回收, 如果频繁的话,
系统的性能损失很大.
tcp驱动是支持scatter write的, 最终是调用writev系统调用的.所以我们要充分利用这一特性.
我们从上面的代码可以看出, io是按照这样的规则填充writev向量的: 如果iolist的元素是
1. int, 拷贝.
2. b ...
今天看到ulimit命令,追溯到limits.conf文件,自己大概梳理了一下这个文件的配置,下面是文件自带的注释:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - an user name ...
和epmd相关的环境变量
ERL_EPMD_RELAXED_COMMAND_CHECK
ERL_EPMD_PORT
ERL_EPMD_ADRESS
相关的使用如下:
[liufan@liufan ~]$ export ERL_EPMD_RELAXED_COMMAND_CHECK=TRUE
[liufan@liufan ~]$ export ERL_EPMD_PORT=4445
[liufan@liufan ~]$ export ERL_EPMD_ADDRESS=192.168.1.110,192.168.0.108
[liufan@liufan ~]$ erl -sname a
...
使用epmd的-port选项时,实验的例子是:
[liufan@liufan ~]$ echo $ERL_EPMD_PORT
[liufan@liufan ~]$ export ERL_EPMD_PORT=4444
[liufan@liufan ~]$ epmd -d
epmd: Tue Jul 2 05:00:39 2013: epmd running - daemon = 0
epmd: Tue Jul 2 05:01:03 2013: ** got NAMES_REQ
epmd: Tue Jul 2 05:01:03 2013: ** sent NAMES_RESP ...
当使用epmd -address时,后面跟的IP_LIST是让epmd监听自己电脑的哪个ip的,例如:
[liufan@liufan ~]$ epmd -address 192.168.1.110 -d
epmd: Tue Jul 2 04:43:17 2013: epmd running - daemon = 0
epmd: Tue Jul 2 04:43:25 2013: ** got NAMES_REQ
epmd: Tue Jul 2 04:43:25 2013: ** sent NAMES_RESP
[liufan@liufan ~]$ netstat -an ...
epmd有一个-stop的选项,当要是用
$epmd -stop name
的时候,本机启动的第一个erlang shell时要加上-relaxed_command_check选项,例如:
erl -sname -epmd "epmd -relaxed_command_check -daemon"
这样的话,就会实现如下效果:
[liufan@liufan ~]$ erl -sname a -epmd "epmd -relaxed_command_check -daemon"
Erlang R16B01 (erts-5.10.2) [source] ...