`
liumengfan
  • 浏览: 32819 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang:port_command函数

阅读更多
今天读到褚霸博客里的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:Erlang_OTP_19_win64

    Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、容错性和可扩展性的分布式系统。OTP则是Erlang生态系统的核心组成部分,提供了大量的库和设计模式,旨在简化并发、错误处理和系统管理。 ...

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    Erlang中执行linux命令的两种方法

    当`os:cmd/1`无法满足更复杂的需求时,你可以使用`erlang:open_port/2`函数。这个函数更为灵活,它允许你创建一个端口来与外部进程通信,包括执行命令、读取输出、处理错误信息以及获取退出状态码。 `erlang:open_...

    erlang_otp_win64_20.3.zip

    是erlang_otp_20.3 的win64安装包,内为exe文件,一路next即可安装完成 是适用于多线程、分布式开发的语言,也是如rabbitmq等重要工具的必须品 使用前需要配置环境变量:1.变量名为ERLANG_HOME,变量值为安装Erlang...

    Erlang安装包,版本:otp_win64_24.1.7.exe

    otp_win64_24.1.7.exe

    esl-erlang_23.0_windows_amd64.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_model.rar_Erlang B _Erlang B model_Wireless Handbook_e

    **Erlang B模型**是通信工程领域中的一个重要概念,特别是在无线通信系统设计中用于评估系统容量和服务质量。这个模型由丹麦工程师A.K. Erlang提出,主要用于预测电话交换系统的呼叫损失概率,即在给定话务量下,...

    erlang_otp_win64_25.0

    1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和容错性方面的强大能力而闻名。Erlang的设计理念是让程序员能够轻松地构建能够并行运行、自我修复和在故障发生时无缝恢复的系统。 2. **OTP**:Open ...

    erlang_environment_win64_21.0.1.zip

    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开发手册,erlang_otp_20.3_man开发手册

    erlang_otp_src_17.3.tar.gz

    5. **验证**:安装完成后,可以通过运行`erl`命令启动Erlang shell,并使用`erlang:system_info(otp_release)`检查版本是否正确。 RabbitMQ是一种基于Erlang OTP平台的消息队列服务器,它利用Erlang的并发特性和OTP...

    Erlang-Formula.zip_Erlang B _Erlang-B_erlang_erlang B计算_erlang C

    Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...

    xiandiao_erlang_Erlang课后习题_

    1. **函数式编程**:Erlang基于函数式编程范式,强调无副作用的纯函数,以及通过数据不可变性来简化并发处理。在Erlang中,程序是由一系列相互独立的函数构成的,它们可以并行执行,提高了系统的性能。 2. **并发与...

    erlang-syntax_tools-19.3.6.4-1.el7.x86_64.rpm

    erlang-syntax_tools-19.3.6.4-1.el7.x86_64.rpm

    erlang_otp_22.2_win64&rabbitmq-server-3.8.3.zip

    Erlang是一种函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、容错性和可扩展性的分布式系统。OTP(Open Telecom Platform)是Erlang的一个核心部分,提供了一套设计模式和库,用于构建...

    erlang_v8_lib:一个小包装器,围绕erlang-v8创建一个迷你框架

    erlang_v8_lib 建立在erlang_v8之上的自以为是JavaScript框架。 erlang_v8_lib是一个Erlang应用程序,其中包括一个小型框架,以简化向脚本环境添加功能的任务。 该应用程序添加了三个主要组件来完成此任务: v8...

    esl-erlang_19.3_osx_10.10_amd64.dmg

    Erlang是一种动态类型的函数式编程语言,以其并发、分布式和实时系统处理能力而闻名,尤其在电信、金融以及互联网应用等领域广泛应用。 描述中的信息同样强调了这是Erlang 19.3版本的macOS 10.10版本,AMD64架构的...

    erlang_otp_src_22.3.tar.gz

    Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...

    erlang_gproc_扩展实现Erlang的全局ets

    Erlang是一种面向并发的、函数式编程语言,被广泛应用于分布式系统和高可用性服务。在Erlang中,ETS(Erlang Term Storage)是内置的一种高效、内存中的数据库,用于存储和检索Erlang术语。然而,ETS的一个限制是它...

Global site tag (gtag.js) - Google Analytics