檢視原始碼 os (核心 v10.2)

作業系統特定函式。

此模組中的函式是作業系統特定的。不小心使用這些函式會導致程式只能在特定平台上執行。另一方面,如果小心使用,這些函式可以幫助程式在大多數平台上執行。

注意

如果此模組中的函式的引數包含「資料類型」章節中描述的無效字元,則會引發 badarg 例外。

摘要

類型

一個字串,包含特定作業系統上使用 file:native_name_encoding() 編碼的環境變數名稱的有效字元。

假設環境變數已正確設定,則字串包含特定作業系統上使用 file:native_name_encoding() 編碼的環境變數名稱和值的有效字元。

一個字串,包含特定作業系統上使用 file:native_name_encoding() 編碼的環境變數值的有效字元。

所有字元都必須是特定作業系統上使用 file:native_name_encoding() 編碼的有效字元。不允許空字元(整數值為零)。

函式

在目標作業系統的命令殼層中執行 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

啟用或停用作業系統訊號。

native 時間單位 傳回目前的 作業系統系統時間

傳回轉換為以引數傳遞的 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().

在目標作業系統的命令殼層中執行 Command,捕獲命令的標準輸出和標準錯誤,並將此結果以字串形式傳回。

可以使用 核心設定參數設定命令殼層,預設情況下,會在系統啟動時偵測殼層。

範例

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

請注意,在某些情況下,從另一個程式呼叫時的命令標準輸出,與直接從作業系統命令殼層呼叫時的命令標準輸出可能不同。

可能的選項是

  • 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() 系統呼叫傳回的處理序識別碼。
連結到此函式

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().

傳回作業系統版本。在大多數系統上,此函式會傳回元組,但如果系統的版本無法表示為三個數字,則會改為傳回字串。

注意

使用此函數前請三思。如果您仍然需要使用它,請務必先 call os:type()