首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

系统 | System

System模块提供了与VM或主机系统直接交互的功能。

时间

System模块还提供随时间工作的功能,返回系统保存的不同时间,支持不同的时间单位。

依靠系统时间的一个复杂因素是它们可能会被调整。例如,当您进入和离开夏令时时,系统时钟将被调整,通常会增加或删除一个小时。我们称这种变化为“时间扭曲”。为了理解这种变化可能是有害的,请想象下面的代码:

代码语言:javascript
复制
## DO NOT DO THIS
prev = System.os_time()
# ... execute some code ...
next = System.os_time()
diff = next - prev

如果在代码执行期间系统时钟发生改变,那么在1秒内执行的代码可能会被报告为超过1小时!为了解决这些问题,虚拟机提供了一个单调的时间System.monotonic_time/0,永远不会减少,也不会跳跃:

代码语言:javascript
复制
## DO THIS
prev = System.monotonic_time()
# ... execute some code ...
next = System.monotonic_time()
diff = next - prev

一般来说,虚拟机提供三种时间测量:

  • os_time/0 - 操作系统报告的时间。这个时间可以及时向前或向后调整,没有限制;
  • system_time/0- os_time/0的VM视图。尽管虚拟机工作在对齐它们,但在时间扭曲的情况下,系统时间和操作系统时间可能不匹配。这个时间不是单调的(即它可能会减少),因为它的行为是由VM时间扭曲模式配置 ;
  • monotonic_time/0-Erlang VM提供的单调增加的时间。

该模块中的时间函数在单元中工作:native(除非另有说明),这取决于操作系统。大多数情况下,所有的计算都是在:native单元中完成的,以避免精度损失,convert_time_unit/3最后调用它来转换为特定的时间单位,比如:millisecond:microsecond。请参阅time_unit/0类型了解更多信息。

有关虚拟机支持的不同时间的更完整简介,请参阅 Erlang文档中有关时间和时间更正章节

总结

类型

time_unit()

要传递给像monotonic_time/1其他一样的功函数的时间单位

函数

argv()

列出命令行参数

argv(args)

修改命令行参数

at_exit(fun)

注册程序退出处理函数

build_info()

Elixir构建信息

cmd(command, args, opts \\ [])

执行给定commandargs

compiled_endianness()

返回系统编译时的字节顺序

convert_time_unit(time, from_unit, to_unit)

time从时间单位转换from_unit为时间单位to_unit

cwd()

当前工作目录

cwd!()

当前工作目录,错误时发生异常

delete_env(varname)

删除一个环境变量

endianness()

返回字节顺序

find_executable(program)

在系统上找到可执行文件

get_env()

返回所有系统环境变量

get_env(varname)

返回给定环境变量的值

get_pid()

Erlang VM进程标识符

halt(status \\ 0)

立即停止Erlang运行时系统

monotonic_time()

:native时间单位返回当前的单调时间

monotonic_time(unit)

以给定时间单位返回当前单调时间

os_time()

返回当前的操作系统时间

os_time(unit)

返回给定时间内的当前操作系统时间unit

otp_release()

返回OTP版本号

put_env(enum)

设置多个环境变量

put_env(varname, value)

设置环境变量值

schedulers()

返回虚拟机中调度程序的数量

schedulers_online()

返回VM中联机调度程序的数量

stacktrace()

最后的异常堆栈跟踪

stop(status \\ 0)

小心停止Erlang运行时系统

system_time()

:native时间单位返回当前系统时间

system_time(unit)

以给定时间单位返回当前系统时间

time_offset()

返回Erlang VM单调时间和Erlang VM系统时间之间的当前时间偏移量

time_offset(unit)

返回Erlang VM单调时间和Erlang VM系统时间之间的当前时间偏移量

tmp_dir()

可写的临时目录

tmp_dir!()

可写的临时目录,错误时发生异常

unique_integer(modifiers \\ [])

生成并返回当前运行时实例中唯一的整数

user_home()

用户主目录

user_home!()

用户主目录,错误时发生异常

version()

Elixir版本信息

类型

Link to this type

time_unit()View Source

代码语言:javascript
复制
time_unit ::
  :second |
  :millisecond |
  :microsecond |
  :nanosecond |
  pos_integer |
  :seconds |
  :milliseconds |
  :microseconds |
  :nanoseconds

要传递给像monotonic_time/1其他人一样的功能的时间单位。

:second:millisecond:microsecond:nanosecond时间单位控制的接受时间单位的功能的返回值。

时间单位也可以是严格正整数。在这种情况下,它代表“每秒部件数”:时间将以1 / parts_per_second秒为单位返回。例如,使用:millisecond时间单位相当于使用1000时间单位(因为时间将以1/1000秒 - 毫秒返回)。

请记住,版本19.1之前的Erlang API将使用:milli_seconds:micro_seconds并且:nano_seconds尽管Elixir将其拼写标准化为符合SI约定,但它们仍以时间单位表示。

类型

Link to this function

argv()View Source

代码语言:javascript
复制
argv() :: [String.t]

列出命令行参数。

返回传递给程序的命令行参数列表。

argv(args)View Source

代码语言:javascript
复制
argv([String.t]) :: :ok

修改命令行参数。

更改命令行参数的列表。谨慎使用它,因为它会破坏以前的任何argv信息。

链接到这个函数

at_exit(fun)查看来源

注册程序退出处理函数。

注册一个将在程序执行结束时被调用的函数。用于在“脚本”模式下调用挂钩。

处理程序始终在与注册处理程序不同的进程中执行。因此,在调用处理程序函数时,调用进程(ETS表,打开文件等)管理的任何资源将不可用。

该函数必须接收退出状态码作为参数。

链接到这个函数

build_info()查看来源

代码语言:javascript
复制
build_info():: map

Elixir构建信息。

使用Elixir版本,Git短版本哈希和编译日期返回关键字列表。

链接到这个函数

cmd(command,args,opts \\ [])查看来源

代码语言:javascript
复制
cmd(binary,[binary],keyword):: { Collectable.t,exit_status :: non_neg_integer}

执行给定commandargs

command 预计是PATH中可用的可执行文件,除非给出绝对路径。

args必须是可执行文件将按其原样接收的二进制文件列表。这意味着:

  • 环境变量不会被内嵌
  • 通配符扩展不会发生(除非Path.wildcard/2明确使用)
  • 为确保shell安全,不需要转义或引用参数。

此函数返回包含收集的结果和命令退出状态的元组。

在内部,这个功能使用一个Port与外部世界进行交互。但是,如果您打算运行一个长时间运行的程序,端口保证stdin / stdout设备将被关闭,但不会自动终止程序。该Port模块的文档描述了这个问题以及“僵尸进程”部分下的可能解决方案。

实例

代码语言:javascript
复制
iex> System.cmd "echo", ["hello"]
{"hello\n", 0}

iex> System.cmd "echo", ["hello"], env: [{"MIX_ENV", "test"}]
{"hello\n", 0}

iex> System.cmd "echo", ["hello"], into: IO.stream(:stdio, :line)
hello
{%IO.Stream{}, 0}

备选方案

  • :into-将结果注入给定的可收集性中,默认为""
  • :cd - 运行命令的目录
  • :env-包含环境键值为二进制的元组的枚举。
  • :arg0-设置命令arg0
  • :stderr_to_stdout-将stderr重定向到stdouttrue
  • :parallelism-如果属实,VM将安排端口任务以改善系统中的并行性。 如果设置为false,VM将尝试立即执行命令,以牺牲并行性为代价来提高延迟。 通过将“+ spp”参数传递给--erl,可以在系统启动时设置默认值。

错误原因

如果给出无效论据,ArgumentError则由...提出System.cmd/3System.cmd/3也期望有一套严格的选项,如果给出未知或无效的选项,将会提高。

此外,System.cmd/3可能失败的原因之一,POSIX详述如下:

  • :system_limit-Erlang模拟器中的所有可用端口都在使用中
  • :enomem-内存不足,无法创建端口
  • :eagain-没有更多可用的操作系统进程
  • :enametoolong-发出的外部命令太长
  • :emfile - 没有更多可用的文件描述符(对于运行Erlang模拟器的操作系统进程)
  • :enfile - 文件表已满(针对整个操作系统)
  • :eacces-命令不指向可执行文件
  • :enoent-命令不指向现有文件

shell命令

如果您希望在shell中执行受信任的命令,使用管道,重定向等,请检查:os.cmd/1

compiled_endianness()

返回系统编译时使用的Endianness。

convert_time_unit(time, from_unit, to_unit)

代码语言:javascript
复制
convert_time_unit(integer, time_unit | :native, time_unit | :native) :: integer

将时间单位从单位时间转换为单位时间。

结果通过发言功能四舍五入。

convert_time_unit/3接受一个额外的时间单位(除了那个time_unit/0类型的):native:native是Erlang运行时系统使用的时间单位。它确定运行时何时启动并保持不变,直到运行时停止。要确定:native系统中单位的含义,可以调用此函数将1秒转换为:native时间单位(即System.convert_time_unit(1, :second, :native))。

cwd()

当前工作目录。

返回当前工作目录,如果不存在,则返回nil。

cwd!()

当前工作目录,错误异常。

返回当前工作目录或引发RuntimeError

delete_env(varname)

代码语言:javascript
复制
delete_env(String.t) :: :ok

删除环境变量。

从环境中移除变量varname。

endianness()

返回Endianness。

find_executable(program)

代码语言:javascript
复制
find_executable(binary) :: binary | nil

在系统上定位可执行文件。

该函数在Unix和Windows上使用环境变量PATH查找可执行程序。它还考虑为每个操作系统正确的可执行文件的扩展,所以对于Windows,它会尝试查找与文件.com.cmd或者类似的扩展。

get_env()

代码语言:javascript
复制
get_env() :: %{optional(String.t) => String.t}

返回所有系统环境变量。

返回的值是包含名称-值对的映射。变量名及其值是字符串。

get_env(varname)

代码语言:javascript
复制
get_env(String.t) :: String.t | nil

返回给定环境变量的值。

环境变量varname的返回值是一个字符串,如果环境变量未定义,则返回nil。

get_pid()

代码语言:javascript
复制
get_pid() :: binary

ErlangVM进程标识符。

以操作系统环境最常用的格式返回当前Erlang模拟器的进程标识符。

有关更多信息,请参阅:os.getpid/0

halt(status \ 0)

代码语言:javascript
复制
halt(non_neg_integer | binary | :abort) :: no_return

立即停止Erlang运行时系统。

在没有正确关闭应用程序和端口的情况下终止Erlang运行时系统。请stop/1仔细关闭系统。

status必须是一个非负整数,原子:abort或二进制。

  • 如果是整数,则运行时系统以返回给操作系统的整数值退出。
  • 如果:abort,如果在操作系统中启用了核心转储,则运行时系统将中止生成核心转储。

  • 如果产生一个字符串,产生一个Erlang故障转储,其状态为口号,然后运行系统退出,状态码为1。

请注意,在许多平台上,操作系统仅支持状态代码0-255。

有关更多信息,请参阅:erlang.halt/1

例子

代码语言:javascript
复制
System.halt(0)
System.halt(1)
System.halt(:abort)

链接到这个函数

monotonic_time()查看来源

代码语言:javascript
复制
monotonic_time():: integer

:native时间单位返回当前的单调时间。

这一次是单调递增的,并且始于未指定的时间点。

由编译器插入:erlang.monotonic_time/0

链接到这个函数

monotonic_time(unit)查看来源

代码语言:javascript
复制
monotonic_time(time_unit):: integer

以给定时间单位返回当前单调时间。

这一次是单调递增的,并且始于未指定的时间点。

链接到这个函数

os_time()查看来源

代码语言:javascript
复制
os_time():: integer

返回当前的操作系统时间。

结果以时间单位返回:native

这个时间可以随时间前后调整,没有限制,也不是单调的。

由编译器插入:os.system_time/0

链接到这个函数

os_time(unit)查看来源

代码语言:javascript
复制
os_time(time_unit):: integer

返回给定时间内的当前操作系统时间unit

这个时间可以随时间前后调整,没有限制,也不是单调的。

链接到这个函数

otp_release()查看来源

代码语言:javascript
复制
otp_release():: String.t

返回OTP版本号。

链接到这个函数

put_env(enum)查看来源

代码语言:javascript
复制
put_env(Enumerable.t):::ok

设置多个环境变量。

为每个键所对应的每个环境变量设置一个新值dict

put_env(varname, value)View Source

代码语言:javascript
复制
put_env(binary, binary) :: :ok

设置环境变量值。

value为环境变量设置一个新的varname

Link to this function

schedulers()View Source

代码语言:javascript
复制
schedulers() :: pos_integer

返回虚拟机中调度程序的数量。

schedulers_online()查看来源

代码语言:javascript
复制
schedulers_online():: pos_integer

返回VM中联机调度程序的数量。

链接到这个函数stacktrace()查看来源

最后的异常堆栈跟踪。

请注意,Erlang虚拟机(因此此函数)不会返回当前的堆栈跟踪,而是返回最新异常的堆栈跟踪。

由编译器插入:erlang.get_stacktrace/0

stop(status \\ 0)View Source

代码语言:javascript
复制
stop(non_neg_integer | binary) :: no_return

小心停止Erlang运行时系统。

所有应用程序均顺利取下,所有代码均已卸载,并且在系统通过调用终止之前所有端口均已关闭halt/1

status 必须是运行时系统返回给操作系统的非负整数值。

请注意,在许多平台上,操作系统仅支持状态代码0-255。

有关更多信息,请参阅:init.stop/1

例子

代码语言:javascript
复制
System.stop(0)
System.stop(1)

链接到这个函数

system_time()查看来源

代码语言:javascript
复制
system_time():: integer

:native时间单位返回当前系统时间。

这是VM的VM视图os_time/0。尽管虚拟机的作用是调整它们,但它们在时间扭曲的情况下可能不匹配。这一次不是单调的。

由编译器插入:erlang.system_time/0

链接到这个函数

system_time(unit)查看来源

代码语言:javascript
复制
system_time(time_unit):: integer

以给定时间单位返回当前系统时间。

这是VM的VM视图os_time/0。尽管虚拟机的作用是调整它们,但它们在时间扭曲的情况下可能不匹配。这一次不是单调的。

链接到这个函数

time_offset()查看来源

代码语言:javascript
复制
time_offset():: integer

返回Erlang VM单调时间和Erlang VM系统时间之间的当前时间偏移量。

结果以:native时间单位返回。

查看time_offset/1更多信息。

由编译器插入:erlang.time_offset/0

链接到这个函数

time_offset(单位)查看来源

代码语言:javascript
复制
time_offset(time_unit):: integer

返回Erlang VM单调时间和Erlang VM系统时间之间的当前时间偏移量。

结果以给定的时间单位返回unit。返回的偏移量加上Erlang单调时间(例如,通过得到 monotonic_time/1),给出与单调时间相对应的Erlang系统时间。

tmp_dir()查看来源

可写的临时目录。

返回一个可写的临时目录。按以下顺序搜索目录:

  • 由TMPDIR环境变量命名的目录。
  • 由temp环境变量命名的目录。
  • 由tmp环境变量命名的目录。
  • C:\TMP在Windows或/tmpUnix上
  • 作为最后的手段,当前的工作目录

如果以上都不可写,则返回nil

tmp_dir!()

可写临时目录,出现错误时出现异常。

tmp_dir/0而引起RuntimeError的,而不是返回nil,如果没有临时目录设置。

unique_integer(modifiers \ [])

代码语言:javascript
复制
unique_integer([:positive | :monotonic]) :: integer

生成并返回当前运行时实例中唯一的整数。

“Unique”意味着此函数使用相同的列表调用modifiers,将不会在当前运行时实例上多次返回相同的整数。

如果modifiers[],则返回唯一的整数(可以是正值或负值)。可以传递其他修饰符来更改返回的整数的属性:

  • :positive-返回的整数保证为正整数。
  • :monotonic - 返回的整数单调递增。这意味着,在相同的运行时实例上(但即使在不同的进程上),使用:monotonic修饰符返回的整数总是严格小于连续调用返回值的整数:monotonic

上面列出的所有修饰符都可以组合; 重复的修饰符modifiers将被忽略。

由编译器插入:erlang.unique_integer/1

user_home()

用户主目录。

返回用户主目录(独立于平台)。

user_home!()

用户主目录,出现错误异常。

user_home/0而引起RuntimeError的,而不是返回nil,如果没有用户家里设置。

version()

代码语言:javascript
复制
version() :: String.t

Elixir版本信息。

以二进制形式返回Elixir的版本。

扫码关注腾讯云开发者

领取腾讯云代金券