自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Rolong的博客

Erlang@C源码探索与编程

  • 博客(41)
  • 资源 (5)
  • 收藏
  • 关注

原创 Erlang虚拟机(VM)简介

Erlang代码是运行在Erlang的虚拟机(VM)上的,所谓虚拟,说它是虚拟一台真实的机器,还不如说它是虚拟了一个运行Erlang指令的CPU来得更确切。Erlang运行在虚拟机上,就好比C语言运行在真实的机器上。Erlang语言的代码在编译时,也有中间的汇编代码,了解它的汇编指令,可以进一步理解Erlang代码在VM里的运行机制。下面我们就把Erlang的Beam模拟器看作是一

2013-07-27 18:00:37 5833

原创 Erlang list的++操作和append函数的底层实现

当提到Erlang中list的++操作符时,我们常会想到它的性能问题。有些人知道++操作比较耗时,就改用函数append来代替。到底++操作和append函数之间有什么区别?我们来查看一下它们在Erlang源码及C源码中的实现。在$ERL_TOP/lib/stdlib/src/lists.erl可以找到如下代码:%% append(X, Y) appen

2013-07-23 09:04:45 7275 3

原创 Erlang中list和tuple的构建及转换的内部实现

Erlang数据类型的内部实现为探索erl内部的tuple和list的构造和内部实现,我们可以从list_to_tuple/1这个erlang的bif函数说起。先看看$ERL_TOP/erts/emulator/beam/bif.c文件中list_to_tuple/1函数的C源码。为了便于说明,对源码做了少量修改,并增加了一些变量打印。list_to_tuple/1的内

2013-07-22 16:34:54 5826

原创 Erlang数据类型的内部实现

Erlang中有8种基础数据类型(integer、 float、 atom、 reference、 fun、 port、 pid、 binary)和两种复合结构(tuple、list)。在erl编程时,对这些数据类的内存分配及引用都是透明的,了解erl数据类型的内部实现,可以让我们更优更合理的运用数据类型,更好地评估程序性能。假设erl中有这么一组数据: 1、2、3、"a"、"b"、"c"

2013-07-22 11:15:45 3694 4

原创 linux内核参数tcp_syn_retries、tcp_retries1和tcp_retries2的源码分析

enum { TCP_ESTABLISHED = 1, TCP_SYN_SENT, TCP_SYN_RECV, TCP_FIN_WAIT1, TCP_FIN_WAIT2, TCP_TIME_WAIT, TCP_CLOSE, TCP_CLOSE_WAIT, TCP_LAST_ACK, TCP_LISTEN, TCP_CLOSING, /* Now a valid state *

2016-09-09 17:46:51 14620 1

原创 AStar A* 算法的Erlang实现

%% @author [email protected]%% 本代码来自 瑞仙的Erlang开发博客%% http://blog.csdn.net/zhongruixian-module(astar1).-export([ find_path/2 ,test/2 ]).-record(state, { open

2015-04-24 11:40:33 2063 3

原创 Erlang的tv、appmon等GUI工具在R17以上版本的启动方法

Erlang R17版本以上,按以前的方法启动tv、appmon等工具,出现如下错误:kernel-poll not supported; "K" parameter ignoredErlang/OTP 17 [erts-6.4] [64-bit] [smp:4:4] [async-threads:10]Eshell V6.4 (abort with ^G)([email protected]

2015-04-13 15:43:52 4598

原创 Erlang静态键值对(key-value)数据分别写入erl文件与ETS表读取的测试

(1)、静态键值对(key-value)数据直接写成erl文件编译后读取比读ETS表快6倍左右;(2)、数据量越大,数据结构越复杂,两者差距越明显;(3)、erl文件太大(大于10M)时,编译会很慢(大于1分钟);(4)、数据量在1w左右,写成erl文件3M内,建议用erl文件形式更快更直接。

2015-04-05 10:12:13 2183

原创 Erlang Port实现调用系统命令并逐行输出执行过程

最近在做一个通过WEB调用系统命令的工具,难点是如何获取执行过程,同时可以逐行输出?想起以前有看到霸爷提到rebar中封装了类似的功能,于是从rebar_utils中整出了下面的东西,很好用。-module(sh_port).-export([sh/1, sh/2]).%%%% Options = [Option] -- defaults to [use_stdout, abo

2015-01-24 10:11:15 1656

原创 Erlang入门:构建application练习5(监督树)

构建application练习5(监督树),以实例完全演示监督树的用法,Erlang入门必须知道的那点事。。。

2015-01-17 17:32:27 1936

原创 Erlang入门:构建application练习4(进程link的作用)

1、示例项目(bank)简介bank_server.erl是为客户服务的进程回调模块bank_center.erl是为银行服务中心的进程回调模块客户(bank_server)每年都要扣除年费所有年费都交给银行服务中心(bank_center)客户服务使用示例:创建用户:bank_server:create_account(myname, 100).用户存钱:

2015-01-16 17:40:31 1725

原创 Erlang入门:构建application练习3(随机启动)

Erlang入门:构建application练习3,实例演示如果构建一个最简单的Erlang Application

2015-01-16 13:29:50 1601

原创 Erlang入门:构建application练习2

1、定义application回调模块%% 文件名为bank_app.erl-module(bank_app).%% 指定behaviour为application-behaviour(application). %% 导出application回调模块的函数-export([start/2, stop/1]). %% 启动application时调用start(

2015-01-16 11:28:48 974

原创 Erlang入门:构建application练习1

1、定义application回调模块%% 文件名为bank_app.erl-module(bank_app).%% 指定behaviour为application-behaviour(application). %% 导出application回调模块的函数-export([start/2, stop/1]). %% 启动application时调用start(_Type,

2015-01-16 10:12:20 1030 2

原创 Erlang入门:gen_server实例操作与练习2

Eshell V5.10.4  (abort with ^G)1> bank_server3:create_account(name1, 1000).true2> name1 ! check.checkYearly Payment: 1000 -> 9403> erlang:send(name1, check).check4> erlang:send(name1,

2015-01-15 09:39:04 2275

原创 Erlang入门:gen_server实例操作与练习1

%% @author Rolong-module(bank_test1).-compile(export_all).%% 假设我开了3个银行账户:%%%% bank_server2:create_account(name1, 100).%% bank_server2:create_account(name2, 100).%% bank_server2:create_account

2015-01-15 09:35:53 1625

原创 Erlang入门:gen_server代码模板

%% gen_server代码模板-module(myserver).-behaviour(gen_server).% --------------------------------------------------------------------% Include files% -----------------------------------------

2015-01-13 15:57:36 1441

原创 Erlang入门:服务进程实例操作与练习3

银行服务使用示例:创建用户:bank_server:create_account(myname, 100).用户存钱:myname ! {deposit, 10}.用户取钱:myname ! {cash1, 20}.myname ! {cash2, 30}.查询余额:myname ! check.========================游戏角色使用示例:

2015-01-13 12:39:13 1004

原创 Erlang入门:服务进程实例操作与练习2

使用示例:创建角色:Pid = player:login(Id).角色加血:Pid ! {add_hp, 100}.角色加魔:Pid ! {add_mp, 100}.查看角色:Pid ! show.%% @author Rolong%%%% 使用示例:%% 创建角色:Pid = player:login(Id).%% 角色加血:Pid ! {add_hp,

2015-01-13 12:33:27 940

原创 Erlang入门:服务进程实例操作与练习1

这是一个用Erlang进程实现的简单银行服务使用示例如下:创建用户:bank:create_account(myname, 100).用户存钱:myname ! {deposit, 10}.用户取钱:myname ! {cash1, 20}.myname ! {cash2, 30}.查询余额:myname ! check.创建用户:bank:create

2015-01-13 09:11:58 867

原创 Erlang入门:进程实例操作与练习3(选修)

%% @author Rolong-module(process3).-compile(export_all).-define(I(F), io:format(F++"~n", [])).-define(I(F, A), io:format(F++"~n", A)).%%'TEST%% vim cmd: 's/\([PE]\)3/\14/gtest1() -

2015-01-11 15:51:49 984

原创 Erlang入门:进程实例操作与练习2

%% @author Rolong-module(process2).-compile(export_all).-include("common.hrl").%% Usage:%% 启动服务:process2:start().%% 查看时间:myserver ! now.%% 结束服务:myserver ! stop.start()-> Pid = spawn(?MO

2015-01-11 09:47:58 964

原创 Erlang入门:进程实例操作与练习1

%% @author Rolong-module(process1).-compile(export_all).-define(I(F), io:format(F++"~n", [])).-define(I(F, A), io:format(F++"~n", A)).%% Usage:%%%% 启动进程:Pid = process1:start(Fun).%%

2015-01-11 09:45:52 1750 1

原创 Erlang面试题:运算符

Erlang运算符练习题,Erlang新手必做题目,应聘面试的基础题目。

2015-01-09 13:45:36 3064 1

原创 Erlang R16+ Crypto模块与最新Openssl不兼容问题

原文地址:http://www.kongqingquan.com/archives/145服务器上新安装了R1601版本后,启动crypto模块 时出现下面的错误:The on_load function for module crypto returned {error,{load_failed,“Failed to load NIF library: ‘/usr/local

2014-12-31 12:21:06 2113

原创 iOS推送通知(Push Notification)的Erlang实现

关于cer/pem证书转换,网上很多资料,我这就不说了,网上有PHP及其他语言实现的Push Notification,可以参考,但大多都是版本OUT了,为了更好的做PUSH服务定制,我这里以Erlang(gen_server)实现iOS Push Notification

2014-09-24 21:29:52 2336

转载 Unicode编码表(汉字部分)

U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F -----------------------------------------------------4e00 一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏4e10 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟4e20 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中

2014-07-12 19:41:06 9824

原创 实例阐述浮点数解包运算过程

浮点数在计算机中存储或传输时,常会遇到读出来的浮点数有N(N>10)位小数的问题,这里以Erlang实例阐述产生这种现象的原因。

2014-03-15 19:39:28 1865

转载 浮点数表示及其实现

首先说一下原,反,补,移码. 移码其实就等于补码,只是符号相反. 对于正数而言,原,反,补码都一样, 对负数而言,反码除符号位外,在原码的基础上按位取反,补码则在反码的基础之上,在其最低位上加1,要求移码时,仍然是先求补码,再改符号.浮点数分为float和double,分别占4,8个字节,即32,64位. 我仅以32位的float为例,并附带说double.在IEEE754标准中,规定,f

2014-03-15 17:54:56 1829 1

原创 Erlang安装时加载openssl的libcrypto.a失败,执行crypto:start()报错的解决方案

两个多月前写过一篇关于这个问题的文章,由于写得比较简略,很多同学还是很纠结这个问题,所以在此补充一下具体的操作过程。很多同学根据我上一篇文章重装后仍然失败的原因,常见的有如下几个:1、加-fPIC参数重装openssl后,不明确新编译出来的静态库libcrypto.a在哪里,如果以前有安装过的,不明确是否被覆盖;2、对于已经编译安装过的源码目录,没有执行make clean;2、重装erlang时,没有具体指定最新安装的ssl目录;3、重装erlang后,直接执行erl时,仍然执行了老的erl,可以

2014-03-12 10:31:08 14182 1

原创 重启Erlang Socket服务时,报出{error, eaddrinuse}错误的解决方法

重启Erlang Socket服务时,gen_tcp:listen/2返回{error, eaddrinuse}错误,是因为上次关闭Socket服务后,TCP 套接字仍处于TIME_WAIT状态,等待数分钟,TIME_WAIT 状态退出之后可以正常启动。如需立即启动,可以在调用gen_tcp:listen/2时将reuseaddr选项设置为true,声明可重用端口,详见:http://

2014-01-09 16:11:39 4704

原创 Erlang的crypto模块与最新的openssl动态链接库不兼容的问题与解决方案

CentOS 6.3 64位,装完Erlang后,出现了crypto模块使用不正常的情况,开始猜测是最新版本的openssl的动态链接库有问题,也请教了余峰老大,叫我在centos 6.2环境下测试一下,于是在一台老服务器上编译当前最新版的erlang R16B03,没有出现问题,但是,用yum更新了OpenSSL后,同样的问题出现了。 新版本的openssl编译出来的动态链接库的问题?

2014-01-06 21:57:59 18164 5

原创 PHP扩展模块解包(由term_to_binary生成的)Erlang ext term格式的二进制数据

有些同学想把Erlang数据通过term_to_binary函数封包后以二制进形式存入数据库,然后用PHP读取并解包成PHP数组。为了解决上面的这种应用场合中遇到的问题,参考peb(Php-Erlang Bridge)扩展写了这个类似erlang:binary_to_term/1函数功能的binary扩展,可以理解为是PHP版的binary_to_term。

2013-10-24 15:15:26 2702 1

原创 初探Erlang的term_to_binary数据封包机制

erlang:term_to_binary/1,2函数返回值是Erlang扩展term格式(Erlang external term format)的binary,即ext_binary(),这个函数能把Erlang数据封装成二进制流,是一种存储和传输Erlang数据的有效途径,甚至可以用这种封包/解包方式用作Socket的通信协议(某页游项目就是这么干的)。读懂Erlang扩展term格式的二进制数据,你就可以用任意语言解包Erlang数据。直接分析二进制流,语言之间沟通无限。

2013-10-16 17:46:29 5205

转载 Erlang运行时提供的原子操作API

尽管Erlang给开发人员提供的语义是基于消息传递式的同步,对于应用开发者来说,使用这种语义可以避免使用锁;但是在Erlang运行时(ERTS)中,为了充分利用多核处理器中多个处理器核心,Erlang运行时采用了多线程的结构,例如一个调度器就运行在一个线程中,因此Erlang运行时本身也是一个多线程应用程序。目前大部分多核处理器都采用共享内存的架构共享数据,因此这些线程之间通信的最高效方式就是通过

2013-09-13 17:22:29 1658

原创 Erlang原子(atom)的内部实现及应用

Erlang的原子(atom)在匹配中有着重要作用,它兼顾了可读性和运行效率。 通过atom,可以实现很多灵活高效的应用,例如动态生成模块名和函数名,动态调用函数。在很多非FP语言里,我们经常是组合字符串来生成函数名,然后赋给一个变量来达到动态调用函数的目的,但是在Erlang里,把字符串变量当作函数名来用是不行的。Erlang的atom是为匹配(比较)而生的,它的作用就是为了匹配更快捷。atom数量上限是1M,并且不参与GC,一旦创建将永远保存,一旦数量超出上限,VM很快就会宕掉,所以不可滥用atom。

2013-07-29 15:34:15 2911 2

原创 实例分析Erlang二进制(Binary)的匹配优化

从《实例分析Erlang二进制(Binary)匹配的内部机制》一文中了解到二进制匹配机制,现在该是付诸行动、动手优化Erlang程序匹配操作的时候了。先看来自《Efficiency Guide User's Guide》的两个Erlang函数实例,它们的功能都是判断一个list和一个binary的内容是否相等。test.erl-module(test).-compile(ex

2013-07-28 17:28:34 3301

原创 实例分析Erlang二进制(Binary)匹配的内部机制

Erlang的二进制操作很简单很强大,《Erlang二进制创建的内部机制和优化》一文介绍了binary的创建,现在就来探索它的逆过程,匹配操作。下面是一个简单实例,它的功能是binary_to_list,把二进制流按字节匹配出来生成list。%% test.erl-module(test).-export([t/1,t2/4]).t(>) -> [H|t(T)];t

2013-07-28 13:44:52 1917

原创 实例分析Erlang的汇编指令

《Erlang虚拟机(VM)简介》一文中介绍的寄存器和指令参数类型是学习Erlang VM相关知识的基础,也是理解本文内容的前提,这里就不赘述了。先看将要分析的实例的Erlang源代码:%% mytest.erl-module(mytest).-compile(export_all).%% 返回atomt1() -> ok.%% 调用BIFt2(A) ->

2013-07-27 23:33:08 2338

原创 Erlang二进制创建的内部机制和优化(二)

Erlang二进程创建的内部机制和优化(一)这一节以实例分析的方式继续探索二进制创建的内部机制。为了验证上一节的内容,首先在erl_bits.c中的erts_bs_appen函数里加入一些调试输出。void print_bin(char *title, unsigned char *data, int len){    Uint index = 0;

2013-07-27 08:20:04 1378

Erlang入门:构建application练习5(监督树)

Erlang入门:构建application练习5(监督树),以实例完全演示监督树的用法,Erlang入门必须知道的那点事

2015-01-17

Erlang入门:构建application练习4(进程link的作用)

Erlang入门:构建application练习4(进程link的作用),实例演示进程link的作用及效果

2015-01-16

Erlang入门:构建application练习2

Erlang入门:构建application练习3,实例演示如果构建一个最简单的Erlang Application

2015-01-16

PHP扩展模块解包Erlang term二进制数据

有些同学想把Erlang数据通过term_to_binary函数封包后以二制进形式存入数据库,然后用PHP读取并解包成PHP数组。 为了解决上面的这种应用场合中遇到的问题, 参考peb(Php-Erlang Bridge)扩展写了这个类似erlang:binary_to_term/1函数功能的binary扩展, 可以理解为是PHP版的binary_to_term。

2013-10-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除