📜  Erlang-端口(1)

📅  最后修改于: 2023-12-03 15:00:36.868000             🧑  作者: Mango

Erlang 端口

在 Erlang 中,端口是连接 Erlang 运行时系统与外部操作系统的通道。端口可以被用来执行其他编程语言或底层操作系统的功能。

创建端口

可以使用 erlang:open_port/2 函数在 Erlang 中创建一个端口。该函数需要两个参数,第一个是一个包含端口命令的二进制串,第二个是选项列表。

{ok, Port} = erlang:open_port({spawn, "ls"}, [binary]).

上述代码创建了一个从 ls 命令的输出连接到一个 Erlang 端口的端口。对该端口进行读写操作时需要按照二进制方式进行。

端口使用

可以使用 erlang:port_command/2 函数向端口发送数据,使用 erlang:port_info/1 函数获取端口的状态信息。

下面的例子向创建的端口发送命令,并读取命令的输出:

{ok, Port} = erlang:open_port({spawn, "ls"}, [binary]),
erlang:port_command(Port, <<"ls /">>),
receive
    {Port, {data, Data}} ->
        io:format("~s~n", [Data])
end,
erlang:port_close(Port).

上述代码输出 ls / 命令的输出结果。

端口协议

端口协议指定了将要被执行的命令的格式、命令的参数等等。Erlang 的标准端口协议是 spawn 协议,它仅支持执行一个命令,执行后立即退出。此外,Erlang 还支持自定义协议。

一个自定义协议需要提供两个函数:

  1. open/2 函数用于打开一个连接。
  2. command/2 函数用于执行一个命令。
注意事项

Erlang 中的端口是异步的,因此在创建一个端口时需要确保该端口的操作不会阻塞 Erlang 运行时系统。

同时,在使用 erlang:port_call/3 函数进行同步调用时,必须确保被调用的进程不会阻塞,否则将会导致整个 Erlang 运行时系统停止响应。因此,在实际使用中,应该使用异步调用。