查看源代码 os (内核 v10.2)

操作系统特定函数。

此模块中的函数是特定于操作系统的。不小心使用这些函数会导致程序只能在特定平台上运行。另一方面,如果小心使用,这些函数可以帮助程序在大多数平台上运行。

注意

如果此模块中的函数的参数根据“数据类型”部分中的描述包含无效字符,则会引发 badarg 异常。

摘要

类型

一个字符串,包含特定操作系统上环境变量名称的有效字符,使用 file:native_name_encoding() 编码。

假设环境变量已正确设置,则是一个字符串,包含特定操作系统上环境变量名称和值的有效字符,使用 file:native_name_encoding() 编码。

一个字符串,包含特定操作系统上环境变量值的有效字符,使用 file:native_name_encoding() 编码。

所有字符都需要是特定操作系统上的有效字符,使用 file:native_name_encoding() 编码。不允许使用空字符(整数值零)。

函数

在目标操作系统的命令 shell 中执行 Command,捕获命令的标准输出和标准错误,并将此结果作为字符串返回。

返回所有环境变量的列表。每个环境变量都表示为一个元组 {VarName,Value},其中 VarName 是变量的名称,Value 是其值。

等效于 find_executable(Name, Path),其中 Path 是当前执行路径(即 Unix 和 Windows 上的环境变量 PATH)。

以与底层操作系统相同的方式查找具有指定名称和搜索路径的可执行程序。

返回所有环境变量的列表。每个环境变量都以 "VarName=Value" 格式的单个字符串表示,其中 VarName 是变量的名称,Value 是其值。

返回环境变量 VarNameValue,如果环境变量未定义,则返回 false

返回环境变量 VarNameValue,如果环境变量未定义,则返回 DefaultValue

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

perf_counter 时间单位返回当前性能计数器值。这是一个高度优化的调用,可能无法跟踪。

返回一个性能计数器,可用作非常快速和高分辨率的时间戳。

为环境变量 VarName 设置新的 Value

启用或禁用操作系统信号。

返回转换为作为参数传递的 Unit 的当前 操作系统系统时间

以与 erlang:timestamp/0 相同的格式返回当前 操作系统系统时间

返回当前操作系统的 Osfamily,在某些情况下还返回 Osname

删除环境变量 VarName

返回操作系统版本。在大多数系统上,此函数返回一个元组,但如果系统具有无法表示为三个数字的版本,则返回一个字符串。

类型

-type env_var_name() :: nonempty_string().

一个字符串,包含特定操作系统上环境变量名称的有效字符,使用 file:native_name_encoding() 编码。

不允许使用空字符(整数值零)。在 Unix 上,不允许使用 = 字符。在 Windows 上,= 字符仅允许作为字符串的第一个字符。

-type env_var_name_value() :: nonempty_string().

假设环境变量已正确设置,则是一个字符串,包含特定操作系统上环境变量名称和值的有效字符,使用 file:native_name_encoding() 编码。

字符串中出现的第一个 = 字符将环境变量名称(在左侧)与环境变量值(在右侧)分隔开。

-type env_var_value() :: string().

一个字符串,包含特定操作系统上环境变量值的有效字符,使用 file:native_name_encoding() 编码。

不允许使用空字符(整数值零)。

-type os_command() :: atom() | io_lib:chars().

所有字符都需要是特定操作系统上的有效字符,使用 file:native_name_encoding() 编码。不允许使用空字符(整数值零)。

-type os_command_opts() :: #{max_size => non_neg_integer() | infinity}.

os:cmd/2 的选项。

  • max_size - os:cmd/2 调用返回的最大数据大小。有关更多详细信息,请参阅 os:cmd/2 文档。

函数

-spec cmd(Command) -> string() when Command :: os_command().

等效于 cmd(Command, #{})

链接到此函数

cmd(Command, Options)

查看源代码 (自 OTP 20.2.3 起)
-spec cmd(Command, Options) -> string() when Command :: os_command(), Options :: os_command_opts().

在目标操作系统的命令 shell 中执行 Command,捕获命令的标准输出和标准错误,并将此结果作为字符串返回。

可以使用 内核配置参数设置命令 shell,默认情况下,shell 在系统启动时检测到。

示例

LsOut = os:cmd("ls"), % on unix platform
DirOut = os:cmd("dir"), % on Win32 platform

请注意,在某些情况下,从另一个程序调用时命令的标准输出与直接从操作系统命令 shell 调用时命令的标准输出可能不同。

可能的选项是

  • max_size - os:cmd 调用返回的最大数据大小。此选项是一项安全功能,当执行的命令可能返回非常大(可能无限)的结果时,应使用此选项。

    > os:cmd("cat /dev/zero", #{ max_size => 20 }).
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
链接到此函数

env()

查看源代码 (自 OTP 24.0 起)
-spec env() -> [{env_var_name(), env_var_value()}].

返回所有环境变量的列表。每个环境变量都表示为一个元组 {VarName,Value},其中 VarName 是变量的名称,Value 是其值。

如果 Unicode 文件名编码有效(请参阅 erl 手册页),则字符串可以包含代码点 > 255 的字符。

-spec find_executable(Name) -> Filename | false when Name :: string(), Filename :: string().

等效于 find_executable(Name, Path),其中 Path 是当前执行路径(即 Unix 和 Windows 上的环境变量 PATH)。

链接到此函数

find_executable(Name, Path)

查看源代码
-spec find_executable(Name, Path) -> Filename | false
                         when Name :: string(), Path :: string(), Filename :: string().

以与底层操作系统相同的方式查找具有指定名称和搜索路径的可执行程序。

Path 应符合操作系统上执行路径的语法。返回可执行程序 Name 的绝对文件名,如果未找到该程序,则返回 false

-spec getenv() -> [env_var_name_value()].

返回所有环境变量的列表。每个环境变量都以 "VarName=Value" 格式的单个字符串表示,其中 VarName 是变量的名称,Value 是其值。

如果 Unicode 文件名编码有效(请参阅 erl 手册页),则字符串可以包含代码点 > 255 的字符。

考虑使用 env/0 以获得更好的 2 元组格式。

-spec getenv(VarName) -> Value | false when VarName :: env_var_name(), Value :: env_var_value().

返回环境变量 VarNameValue,如果环境变量未定义,则返回 false

如果 Unicode 文件名编码有效(请参阅 erl 手册页),则字符串 VarNameValue 可以包含代码点 > 255 的字符。

链接到此函数

getenv(VarName, DefaultValue)

查看源代码 (自 OTP 18.0 起)
-spec getenv(VarName, DefaultValue) -> Value
                when
                    VarName :: env_var_name(), DefaultValue :: env_var_value(), Value :: env_var_value().

返回环境变量 VarNameValue,如果环境变量未定义,则返回 DefaultValue

如果 Unicode 文件名编码有效(请参阅 erl 手册页),则字符串 VarNameValue 可以包含代码点 > 255 的字符。

-spec getpid() -> Value when Value :: string().

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

返回 Value 作为包含进程(通常)数字标识符的字符串。

  • 在 Unix 上,这通常是 getpid/0 系统调用的返回值。
  • 在 Windows 上,使用 GetCurrentProcessId() 系统调用返回的进程 ID。
链接到此函数

perf_counter()

查看源代码 (自 OTP 19.0 起)
-spec perf_counter() -> Counter when Counter :: integer().

perf_counter 时间单位返回当前性能计数器值。这是一个高度优化的调用,可能无法跟踪。

链接到此函数

perf_counter(Unit)

查看源代码 (自 OTP 19.0 起)
-spec perf_counter(Unit) -> integer() when Unit :: erlang:time_unit().

返回一个性能计数器,可用作非常快速和高分辨率的时间戳。

此计数器直接从硬件或操作系统读取,具有相同的保证。这意味着不能保证对该函数的两个连续调用是单调的,尽管它很可能是单调的。性能计数器将转换为作为参数传递的分辨率。

1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
176525861
2> T2 - T1.
10004
链接到此函数

putenv(VarName, Value)

查看源代码
-spec putenv(VarName, Value) -> true when VarName :: env_var_name(), Value :: env_var_value().

为环境变量 VarName 设置新的 Value

如果 Unicode 文件名编码有效(请参阅 erl 手册页),则字符串 VarNameValue 可以包含代码点 > 255 的字符。

在 Unix 平台上,如果 Unicode 文件名转换有效,则使用 UTF-8 编码设置环境。在 Windows 上,使用宽字符接口设置环境。

链接到此函数

set_signal(Signal, Option)

查看源代码 (自 OTP 20.0 起)
-spec set_signal(Signal, Option) -> ok
                    when
                        Signal ::
                            sighup | sigquit | sigabrt | sigalrm | sigterm | sigusr1 | sigusr2 |
                            sigchld | sigstop | sigtstp,
                        Option :: default | handle | ignore.

启用或禁用操作系统信号。

每个信号可以设置为以下选项之一

  • ignore - 此信号将被忽略。

  • default - 此信号将使用操作系统的默认信号处理程序。

  • handle - 当 Erlang 运行时系统收到此信号时,此信号将通知 erl_signal_server

链接到此函数

system_time()

查看源代码 (自 OTP 18.0 起)
-spec system_time() -> integer().

native 时间单位返回当前 操作系统系统时间

注意

此时间不是单调递增的时间。

链接到此函数

system_time(Unit)

查看源代码 (自 OTP 18.0 起)
-spec system_time(Unit) -> integer() when Unit :: erlang:time_unit().

返回转换为作为参数传递的 Unit 的当前 操作系统系统时间

调用 os:system_time(Unit) 等效于 erlang:convert_time_unit(os:system_time(), native, Unit)

注意

此时间不是单调递增的时间。

-spec timestamp() -> Timestamp when Timestamp :: erlang:timestamp().

以与 erlang:timestamp/0 相同的格式返回当前 操作系统系统时间

该元组可以与函数 calendar:now_to_universal_time/1calendar:now_to_local_time/1 一起使用以获取日历时间。使用日历时间以及此函数返回的元组的 MicroSecs 部分,可以以高分辨率记录时间戳,并与操作系统其余部分的时间一致。

以 "DD Mon YYYY HH:MM:SS.mmmmmm" 格式格式化字符串的代码示例,其中 DD 是月份的日期,Mon 是文本月份名称,YYYY 是年份,HH:MM:SS 是时间,mmmmmm 是六位数的微秒

-module(print_time).
-export([format_utc_timestamp/0]).
format_utc_timestamp() ->
    TS = {_,_,Micro} = os:timestamp(),
    {{Year,Month,Day},{Hour,Minute,Second}} =
calendar:now_to_universal_time(TS),
    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    "Aug","Sep","Oct","Nov","Dec"}),
    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

此模块可以按如下方式使用

1> io:format("~s~n",[print_time:format_utc_timestamp()]).
29 Apr 2009  9:55:30.051711

操作系统系统时间也可以通过 system_time/0system_time/1 检索。

-spec type() -> {Osfamily, Osname} when Osfamily :: unix | win32, Osname :: atom().

返回当前操作系统的 Osfamily,在某些情况下还返回 Osname

在 Unix 上,Osname 的值与 uname -s 返回的值相同,但为小写。例如,在 Solaris 1 和 2 上,它是 sunos

在 Windows 上,Osnament

注意

在使用此函数之前请三思。如果要以可移植的方式检查或构建文件名,请使用模块 filename。避免匹配原子 Osname

链接到此函数

unsetenv(VarName)

查看源码 (自 OTP R16B03 起)
-spec unsetenv(VarName) -> true when VarName :: env_var_name().

删除环境变量 VarName

如果 Unicode 文件名编码生效(请参考 erl 手册页),字符串 VarName 可以包含代码点大于 255 的字符。

-spec version() -> VersionString | {Major, Minor, Release}
                 when
                     VersionString :: string(),
                     Major :: non_neg_integer(),
                     Minor :: non_neg_integer(),
                     Release :: non_neg_integer().

返回操作系统版本。在大多数系统上,此函数返回一个元组,但如果系统具有无法表示为三个数字的版本,则返回一个字符串。

注意

使用此函数之前请三思。如果仍然需要使用,请始终先 调用 os:type()