今天读到
褚霸博客里的
gen_tcp:send的深度解刨和使用指南(初稿)时,顺着霸爷的思路,跟着
lib/kernel/src/gen_tcp.erl
send(S, Packet) when is_port(S) ->
case inet_db:lookup_socket(S) of
{ok, Mod} ->
Mod:send(S, Packet);
Error ->
Error
end.
lib/kernel/src/inet_tcp.erl
%%
%% Send data on a socket
%%
send(Socket, Packet, Opts) -> prim_inet:send(Socket, Packet, Opts).
send(Socket, Packet) -> prim_inet:send(Socket, Packet, []).
erts/preloaded/src/prim_inet.erl
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% SEND(insock(), Data) -> ok | {error, Reason}
%%
%% send Data on the socket (io-list)
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% This is a generic "port_command" interface used by TCP, UDP, SCTP, depending
%% on the driver it is mapped to, and the "Data". It actually sends out data,--
%% NOT delegating this task to any back-end. For SCTP, this function MUST NOT
%% be called directly -- use "sendmsg" instead:
%%
send(S, Data, OptList) when is_port(S), is_list(OptList) ->
?DBG_FORMAT("prim_inet:send(~p, ~p)~n", [S,Data]),
try erlang:port_command(S, Data, OptList) of
false -> % Port busy and nosuspend option passed
?DBG_FORMAT("prim_inet:send() -> {error,busy}~n", []),
{error,busy};
true ->
receive
{inet_reply,S,Status} ->
?DBG_FORMAT("prim_inet:send() -> ~p~n", [Status]),
Status
end
catch
error:_Error ->
?DBG_FORMAT("prim_inet:send() -> {error,einval}~n", []),
{error,einval}
end.
看到了使用erlang:port_command/3来向ERTS发送数据,根据erlang:port_command的文档的说明,
引用
port_command(Port, Data, OptionList) -> boolean()
Types:
Port = port() | atom()
Data = iodata()
Option = force | nosuspend
OptionList = [Option]
Sends data to a port. port_command(Port, Data, [])
equals port_command(Port, Data).
If the port command is aborted false is returned; oth-
erwise, true is returned.
If the port is busy, the calling process will be sus-
pended until the port is not busy anymore.
Currently the following Options are valid:
force:
The calling process will not be suspended if the
port is busy; instead, the port command is forced
through. The call will fail with a notsup exception
if the driver of the port does not support this.
For more information see the ERL_DRV_FLAG_SOFT_BUSY
driver flag.
nosuspend:
The calling process will not be suspended if the
port is busy; instead, the port command is aborted
and false is returned.
我们知道OptionList可以是force和nosuspend,当设置该选项时,如果port处于busy状态,该调用进程不会被挂起,而是会强制执行,如果这个端口的驱动不支持该行为的话,调用程序将收到一个notsup的异常;当nosuspend选项被设置时,如果port处于busy状态,调用进程不会被挂起,而是收到false的返回。
而在erlang:system_monitor/2中,
引用
erlang:system_monitor(MonitorPid, Options) -> MonSettings
Types:
MonitorPid = pid()
Options = [system_monitor_option()]
MonSettings = undefined | {OldMonitorPid, OldOp-
tions}
OldMonitorPid = pid()
OldOptions = [system_monitor_option()]
system_monitor_option() = busy_port
| busy_dist_port
| {long_gc, integer() >= 0}
| {long_schedule, integer() >= 0}
| {large_heap, integer() >= 0}
.....
busy_port:
If a process in the system gets suspended because
it sends to a busy port, a message {monitor, Sus-
Pid, busy_port, Port} is sent to MonitorPid. SusPid
is the pid that got suspended when sending to Port.
如果设置了busy_port选项时,当被monitor的进程因为调用的port处于busy状态而被挂起时,monitor进程会收到{monitor, SusPid, busy_port, Port}消息,SusPid是被监控的进程ID
分享到:
相关推荐
Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、容错性和可扩展性的分布式系统。OTP则是Erlang生态系统的核心组成部分,提供了大量的库和设计模式,旨在简化并发、错误处理和系统管理。 ...
erlang-sd_notify-1.0-2.el7.x86_64.rpm
esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...
当`os:cmd/1`无法满足更复杂的需求时,你可以使用`erlang:open_port/2`函数。这个函数更为灵活,它允许你创建一个端口来与外部进程通信,包括执行命令、读取输出、处理错误信息以及获取退出状态码。 `erlang:open_...
是erlang_otp_20.3 的win64安装包,内为exe文件,一路next即可安装完成 是适用于多线程、分布式开发的语言,也是如rabbitmq等重要工具的必须品 使用前需要配置环境变量:1.变量名为ERLANG_HOME,变量值为安装Erlang...
otp_win64_24.1.7.exe
这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载
**Erlang B模型**是通信工程领域中的一个重要概念,特别是在无线通信系统设计中用于评估系统容量和服务质量。这个模型由丹麦工程师A.K. Erlang提出,主要用于预测电话交换系统的呼叫损失概率,即在给定话务量下,...
1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和容错性方面的强大能力而闻名。Erlang的设计理念是让程序员能够轻松地构建能够并行运行、自我修复和在故障发生时无缝恢复的系统。 2. **OTP**:Open ...
Erlang是一种高级编程语言,特别适用于并发处理和分布式系统,尤其在电信、银行和互联网领域广泛应用。"erlang_environment_win64_21.0.1.zip" 是一个专门为Windows 10 64位操作系统提供的Erlang开发环境的安装包。...
erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册
5. **验证**:安装完成后,可以通过运行`erl`命令启动Erlang shell,并使用`erlang:system_info(otp_release)`检查版本是否正确。 RabbitMQ是一种基于Erlang OTP平台的消息队列服务器,它利用Erlang的并发特性和OTP...
Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...
1. **函数式编程**:Erlang基于函数式编程范式,强调无副作用的纯函数,以及通过数据不可变性来简化并发处理。在Erlang中,程序是由一系列相互独立的函数构成的,它们可以并行执行,提高了系统的性能。 2. **并发与...
erlang-syntax_tools-19.3.6.4-1.el7.x86_64.rpm
Erlang是一种函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、容错性和可扩展性的分布式系统。OTP(Open Telecom Platform)是Erlang的一个核心部分,提供了一套设计模式和库,用于构建...
erlang_v8_lib 建立在erlang_v8之上的自以为是JavaScript框架。 erlang_v8_lib是一个Erlang应用程序,其中包括一个小型框架,以简化向脚本环境添加功能的任务。 该应用程序添加了三个主要组件来完成此任务: v8...
Erlang是一种动态类型的函数式编程语言,以其并发、分布式和实时系统处理能力而闻名,尤其在电信、金融以及互联网应用等领域广泛应用。 描述中的信息同样强调了这是Erlang 19.3版本的macOS 10.10版本,AMD64架构的...
Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...
Erlang是一种面向并发的、函数式编程语言,被广泛应用于分布式系统和高可用性服务。在Erlang中,ETS(Erlang Term Storage)是内置的一种高效、内存中的数据库,用于存储和检索Erlang术语。然而,ETS的一个限制是它...