在 erlang 虚拟机中,port 是链接 process 的消息传递世界,与 erlang 虚拟机之外 linux 系统世界的桥梁。在 process 看来,port是一种特殊的资源。
让我们来看看在 elixir 中可以如何操作 port。
新建 port
iex(5)> port = Port.open('computer', [])
#Port<0.5>
注意 port 的 name 由于历史原因需要使用 charlist. 新建成功后会得到一个 port 的 id。
查看 port 信息
iex(6)> Port.info port
[
name: 'computer',
links: [#PID<0.105.0>],
id: 40,
connected: #PID<0.105.0>,
input: 0,
output: 0,
os_pid: :undefined
]
我们看到一个 port 可以 link 到多个 porcess,这里的 link 机制和 process 之间的 link 机制是一样的,即 crash 会传导。
一个 port 同时只能 connect 到一个 process。connect 意味着 port 的所有消息都会发送到这个 process.
更改 connected
iex(7)> tom = spawn(fn -> :timer.sleep(1000000) end)
#PID<0.114.0>
iex(8)> Port.connect port, tom
true
iex(9)> Port.connect port, tom
true
iex(10)> Port.info port
[
name: 'computer',
links: [#PID<0.105.0>, #PID<0.114.0>],
id: 40,
connected: #PID<0.114.0>,
input: 0,
output: 0,
os_pid: :undefined
]
connect 到另外一个进程后,旧的进程的 link 会保持,除非我们手动 unlink。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。