《erlang程序设计》第15章案例的运行和解析

文章目的:梳理整个案例的运行流程,记录运行时的注意事项。

前言

第15章中,是一个将erlang与外部c程序连接运行的案例。这个案例的代码跳跃度比较大,说明也很少,尤其是c程序部分,我现在还不是特别清楚,但是经过仔细研究,对整个程序的运行结构有了总体的了解,如下是我的学习总结。

程序结构

《erlang程序设计》第15章案例的运行和解析
说明:

  1. 主进程就是使用erl 进入的那个进程。
  2. 系统进程是利用process_flag(trap_exit,true)设置《erlang程序设计》第15章案例的运行和解析

因此整个程序的核心是

  1. 利用spawn创建一个系统进程。
  2. 通过open_port/2 创建一个端口。
  3. 利用 Port ! {Pid,{comment,Data}} 向端口发送数据。
  4. 在系统进程中接收 {Port,{data,Reply}} 格式的返回数据。

运行程序

完成程序可以在这里下载
https://pragprog.com/titles/jaerlang2/source_code

找到ports文件夹,内容如下:
《erlang程序设计》第15章案例的运行和解析
经过测试,对于15章的案例,只需要划线这四个文件,运行步骤如下:

  1. 在命令行界面运行gcc -o example1 example1_driver.c 将example1_driver.c 编译成 example1.exe。
  2. 输入erl,进入erlang
  3. c(example1)编译example1.erl 为example1.beam
  4. example1:start(). 启动程序,它会创建系统进程和端口进程,并与之交互。
  5. example1:sum(1,2). 这时就可以使用 sum/2 , twice/1 ,stop/0 函数了。

最终有这些文件:
《erlang程序设计》第15章案例的运行和解析

总结

对于erlang程序部分已经完全理解,也清楚整个流程和关键步骤。但是对于外部c程序部分,还不怎么理解的明白,主要是erl_comm.c文件吃不透,对于从erlang中传来的数据大概是以二进制的形式出现,所以这个函数包括了很多纯数据的代码,所以不是特别能理解。
不过总的来说程序能运行了(虽然花了一上午),重要的部分也看懂了,还是收获很大。