erlang%2b-c语言程序接口.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 的一个进

您可能关注的文档

文档评论(0)

zsmfjh + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档