首页 > Erlang并发教程 > 10.5 Erlang并发编程-端口
2013
11-19

10.5 Erlang并发编程-端口

BACK TOP文章索引

  1. 端口
  2. 共0条评论

端口

端口提供了与外部世界通讯的基本机制。用Erlang编写的应用程序往往需要与Erlang系统之外的对象交互。还有一些现存的软件包,例如窗口系统、数据库系统,或是使用C、Modula2等其他语言的程序,在使用它们构建复杂系统时,也往往需要给它们提供Erlang接口。

从程序员的视角来看,我们希望能够以处理普通Erlang程序的方式来处理Erlang系统外的所有活动。为了创造这样的效果,我们需要将Erlang系统外的对象伪装成普通的Erlang进程。端口(Port),一种为Erlang系统和外部世界提供面向字节的通讯信道的抽象设施,就是为此而设计的。

执行open_port(PortName, PortSettings)可以创建一个端口,其行为与进程类似。执行open_port的进程称为该端口的连接进程。需要发送给端口的消息都应发送至连接进程。外部对象可以通过向与之关联的端口写入字节序列的方式向Erlang系统发送消息,端口将给连接进程发送一条包含该字节序列的消息。

系统中的任意进程都可以与一个端口建立链接,端口和Erlang进程间的EXIT信号导致的行为与普通进程的情况完全一致。端口只理解三种消息:

Port ! {PidC, {command, Data}}
Port ! {PidC, {connect, Data}}
Port ! {PidC, close}

PidC必须是一个连接进程的Pid。这些消息的含义如下:

{command, Data}

Data描述的字节序列发送给外部对象。Data可以是单个二进制对象,也可以是一个元素为0..255范围内的整数的非扁平列表[2]。没有响应。

close

关闭端口。端口将向连接进程回复一条{Port, closed}消息。

{connect, Pid1}

将端口的连接进程换位Pid1。端口将向先前的连接进程发送一条{Port, connected}消息。

此外,连接进程还可以通过以下方式接收数据消息:

receive
    {Port, {data, Data}} ->
        ... an external object has sent data to Erlang ...
    ...
end

在这一节中,我们将描述两个使用端口的程序:第一个是在Erlang工作空间内部的Erlang进程;第二个是在Erlang外部执行的C程序。


留下一个回复

你的email不会被公开。