在 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, tomtrueiex(9)> Port.connect port, tomtrueiex(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。