📅  最后修改于: 2023-12-03 15:00:36.868000             🧑  作者: Mango
在 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 还支持自定义协议。
一个自定义协议需要提供两个函数:
open/2
函数用于打开一个连接。command/2
函数用于执行一个命令。Erlang 中的端口是异步的,因此在创建一个端口时需要确保该端口的操作不会阻塞 Erlang 运行时系统。
同时,在使用 erlang:port_call/3
函数进行同步调用时,必须确保被调用的进程不会阻塞,否则将会导致整个 Erlang 运行时系统停止响应。因此,在实际使用中,应该使用异步调用。