《erlang程序设计》第15章案例的运行和解析
文章目的:梳理整个案例的运行流程,记录运行时的注意事项。
前言
第15章中,是一个将erlang与外部c程序连接运行的案例。这个案例的代码跳跃度比较大,说明也很少,尤其是c程序部分,我现在还不是特别清楚,但是经过仔细研究,对整个程序的运行结构有了总体的了解,如下是我的学习总结。
程序结构
说明:
- 主进程就是使用erl 进入的那个进程。
- 系统进程是利用
process_flag(trap_exit,true)
设置
因此整个程序的核心是:
- 利用spawn创建一个系统进程。
- 通过open_port/2 创建一个端口。
- 利用 Port ! {Pid,{comment,Data}} 向端口发送数据。
- 在系统进程中接收 {Port,{data,Reply}} 格式的返回数据。
运行程序
完成程序可以在这里下载
https://pragprog.com/titles/jaerlang2/source_code
找到ports
文件夹,内容如下:
经过测试,对于15章的案例,只需要划线这四个文件,运行步骤如下:
- 在命令行界面运行
gcc -o example1 example1_driver.c
将example1_driver.c 编译成 example1.exe。 - 输入
erl
,进入erlang -
c(example1)
编译example1.erl 为example1.beam -
example1:start().
启动程序,它会创建系统进程和端口进程,并与之交互。 -
example1:sum(1,2).
这时就可以使用 sum/2 , twice/1 ,stop/0 函数了。
最终有这些文件:
总结
对于erlang程序部分已经完全理解,也清楚整个流程和关键步骤。但是对于外部c程序部分,还不怎么理解的明白,主要是erl_comm.c文件吃不透,对于从erlang中传来的数据大概是以二进制的形式出现,所以这个函数包括了很多纯数据的代码,所以不是特别能理解。
不过总的来说程序能运行了(虽然花了一上午),重要的部分也看懂了,还是收获很大。