- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Erlang 可以和多种程序语言连接,比如 C 语言 java 语言等。一般来讲,A 语言有两种方式可以调用 B 语言设计的程序。第一种,把 B 语言的可执行二进制代码拷贝到 A 程序中,定义标准的参数调用接口,从而,B 程序执行的结果返回到 A 程序中。第二种,两个独立的进程,A 进程可以和 B 进程通信。在 Erlang 中,采用的是第二种方法,本文中,我们就讲解 Erlang 和 C 语言的接口。
首先要弄清楚,和 C 语言交互数据的方法之一是采用“标准输入输出”,比如你可以通过控制台(Dos)给 C 程序输入一个值,并再回显。Erlang 虚拟机的底层驱动实现了代替“标准输入输出”的功能,这就是 Erlang 和 C 程序传递数据的底层原理。你可能想知道,底层是如何实现这个的呢?这与 Windows 操作系统以及驱动有关系,我们暂时先不用管它。
好了,我们先来写一个 C 程序,代码如下:
#include stdafx.h
#include io.h
int _tmain(int argc, _TCHAR* argv[])
{
int fn, arg1, arg2, result;
char buff[100];
int len;
while((len = _read(0, buff, 4)) 0){
arg1 = buff[2];
arg2 = buff[3];
result = arg1 + arg2;
buff[0] = 0;
buff[1]=1;
buff[2] = result;
_write(1, buff, 3);
}
}
逐个来看吧。stdafx.h 包含了 windows 的一些函数库,叫做 Afx 函数库,定义了很多函数,包括 _tmain()函数,传统的 C 语言使用的是 main()函数。
io.h 文件包含了从一个标准输入输出设备上读取数据的函数,包括 _read, _write 函数。大家可以在 MSDN 上查一下_read 和_wirte 函数的定义,这里你只需要知道,_read 的第一个参数的含义:当第一个参数为 0 时,意味着输入,为 1 时表示输出,其它两个参数一个缓冲区指针,另一个是字节长度。
你可以编译并运行一下,然后单步跟踪一下,运行时,会弹出一个控制台,要你输入一段字符,然后,它再回显 3 个字符。你可以输入 1234 然后回车,试一下,再单步跟踪一下看看,相信这段代码的逻辑你肯定能明白,可问题是为什么要用这样一个古怪的 C 程序进行学习呢?好,现在我就来解释。
Erlang 把和所有外部程序(比如 C 程序)交互数据的方法交给 Port 去完成,因此,当你
Erlang 代码想调用外部的 C 程序时,首先需要创建一个端口。Erlang 提供了创建端口的函数:
YourPort = open_port(PortName, PortSettings).
先别管参数的定义。每个端口必须绑定到一个 Erlang 进程中,一般来讲,创建 Erlang 端口的进程即为端口连接进程。创建号端口后,你就可以向该端口发送数据,或者从端口读取数据:
YourPort ! {Pid, {command, Data}}. 该命令向端口名 YourPort 发送数据 Data,其中 Pid
是端口连接进程。
receive
{YourPort, {data, Data}} -
...
当发送完数据后,如果外部程序有返回,那么上面代码可以读到返回的数据 Data。你可能会奇怪,为什么向端口发送数据的函数还要包括“端口管理进程”呢?
YourPort ! {Pid, {command, Data}}为什么不能改为:YourPort ! {command, Data}. 其实我
也很纳闷,为什么创建一个端口后,端口不能独立于所谓的“端口管理进程”?我不是 Erlang 的发明人,暂时也不清楚,那就先别管了,我们记住这个规则就好了。正因为有这样的规则, Erlang 才提供了另外一个函数:
YourPort ! {Pid1, {connect, Pid2}}. 该命令把 YourPort 端口的连接管理进程从 Pid1 改为 Pid2.
最后,Erlang 还提供了关闭一个端口的函数:
YourPort !{Pid, close}.
当然,这只是关闭一个端口,而没有关闭那个“连接管理进程”,我感觉,所谓的“连接管理进程”只是一个名义上的管理,因为 Erlang 没有给我们暴露任何函数去改变“管理”的细节。关闭一个端口的本质是 Erlang 向外部程序发送一个空字节,因此,如果外部程序试图读取输入的时候,读取的字节长度为 0.
另外,大家要知道这样一个事实,即,shell 本身也是 Erlang 的一个进
您可能关注的文档
- digsi中文调试软件介绍.ppt
- dmc算法matlab编程及仿真.pdf
- dos下如何安装windwows xp系统.doc
- drive window使用简易说明.ppt
- drivewindow light连接设置指导.pdf
- dset工具1.9使用说明(linux版).doc
- dsp实验一 数据存取实验.docx
- dt-2数显自动电压调节器.doc
- dt-2系列电压自动调节器.doc
- d通信中间件软件需求规格说明书.doc
- 4.3其它常用机构(课件)-高一《汽车机械基础》同步教学(北京理工大学出版社).pdf
- 7.1轴(课件)-高一《汽车基础基础》同步教学(武汉大学出版社).pptx
- 15.2 齿轮传动课件 高一《汽车机械基础》同步教学(电子工业版).pptx
- 3.1视图-(课件)-高一《汽车机械基础》同步教学(北京理工大学出版社).pdf
- 3.1构件与运动副(课件)-高一《汽车机械基础》同步教学(武汉大学出版社).pptx
- 4.6齿轮传动的失效形式及齿轮材料的选择(课件)-高一《汽车机械基础》同步教学(武汉大学出版社).pptx
- 8.1互换性与标准化(课件)-高一《汽车基础基础》同步教学(武汉大学出版社).pptx
- 2.4摩擦与自锁(课件)-高一《汽车机械基础》同步教学(北京理工大学出版社).pdf
- 4.1齿轮传动概述(课件)-高一《汽车机械基础》同步教学(武汉大学出版社).pptx
- 2.1材料及其成形工艺的简要发展过程(课件)-高一《汽车机械基础》同步教学(武汉大学出版社).pptx
原创力文档


文档评论(0)