Исходный код System
Модуль System предоставляет функции, которые взаимодействуют непосредственно с виртуальной машиной или системной средой.
Время
Модуль System также предоставляет функции для работы со временем, возвращая различные системные временные метки с поддержкой разных единиц измерения времени.
Одной из сложностей при использовании системного времени является то, что оно может корректироваться. Например, при переходе на летнее или зимнее время системные часы будут корректироваться, часто добавляя или убирая один час. Такие изменения мы называем «временными искажениями». Для понимания того, как такие изменения могут быть вредны, рассмотрим следующий код:
## DO NOT DO THIS prev = System.os_time() # ... execute some code ... next = System.os_time() diff = next - prev
Если во время выполнения кода системные часы изменятся, то некоторый код, выполнявшийся в течение 1 секунды, может быть отчётён как выполнявшийся более 1 часа! Для решения этой проблемы виртуальная машина предоставляет монотонное время через System.monotonic_time/0, которое никогда не уменьшается и не прерывается:
## 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с точки зрения виртуальной машины. Системное время и время операционной системы могут не совпадать в случае временных искажений, хотя виртуальная машина стремится их согласовать. Это время не монотонно (то есть может уменьшаться), поскольку его поведение настраивается режимом виртуальной машины по исправлению времени;monotonic_time/0- монотонно возрастающее время, предоставляемое Erlang виртуальной машиной. Это не строго монотонно возрастающее. Несколько последовательных вызовов функции могут возвращать одно и то же значение.
Функции времени в этом модуле работают в единицах :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 \\ [])
Выполняет заданную
commandсargs.- compiled_endianness()
Возвращает порядок байтов, с которым была скомпилирована система.
- convert_time_unit(time, from_unit, to_unit)
Преобразует
timeиз единицы измерения времениfrom_unitв единицу измерения времениto_unit.- cwd() устаревший
Текущая рабочая директория.
- cwd!() устаревший
Текущая рабочая директория, исключение при ошибке.
- delete_env(varname)
Удаляет переменную среды.
- endianness()
Возвращает порядок байтов.
- fetch_env(varname)
Возвращает значение заданной переменной среды или
:error, если она не найдена.- fetch_env!(varname)
Возвращает значение заданной переменной среды или генерирует исключение, если она не найдена.
- find_executable(program)
Находит исполняемый файл на системе.
- get_env()
Возвращает все переменные среды системы.
- get_env(varname, default \\ nil)
Возвращает значение заданной переменной среды.
- get_pid() устаревший
Идентификатор процесса виртуальной машины Erlang.
- halt(status \\ 0)
Немедленно останавливает систему выполнения Erlang.
- monotonic_time()
Возвращает текущее монотонное время в единице измерения времени
:native.- monotonic_time(unit)
Возвращает текущее монотонное время в заданной единице измерения времени.
- no_halt()
Проверяет, будет ли система остановлена в конце обработки ARGV.
- no_halt(boolean)
Отмечает, должна ли система быть остановлена в конце обработки ARGV.
- os_time()
Возвращает текущее время операционной системы (OS).
- os_time(unit)
Возвращает текущее время операционной системы (ОС) в заданном временном
unit.- otp_release()
Возвращает номер релиза Erlang/OTP.
- pid()
Возвращает PID операционной системы для текущего экземпляра Erlang среды выполнения.
- put_env(enum)
Устанавливает несколько переменных среды.
- put_env(varname, value)
Устанавливает значение переменной среды.
- restart()
Перезапускает все приложения в системе выполнения Erlang.
- schedulers()
Возвращает количество планировщиков в виртуальной машине.
- schedulers_online()
Возвращает количество активных планировщиков в виртуальной машине.
- shell(command, opts \\ [])
Выполняет указанную
commandв оболочке ОС.- stacktrace() устаревшая
Устаревший механизм получения последнего стека исключений.
- stop(status \\ 0)
Асинхронно и аккуратно останавливает систему выполнения Erlang.
- system_time()
Возвращает текущее системное время в
:nativeединицах времени.- system_time(unit)
Возвращает текущее системное время в заданных единицах времени.
- time_offset()
Возвращает текущий временной сдвиг между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
- time_offset(unit)
Возвращает текущий временной сдвиг между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
- tmp_dir()
Запись каталога временных файлов.
- tmp_dir!()
Запись каталога временных файлов, исключение при ошибке.
- trap_signal(signal, id \\ make_ref(), fun)
Перехватывает указанный
signalдля выполненияfun.- unique_integer(modifiers \\ [])
Генерирует и возвращает целое число, уникальное в текущем экземпляре среды выполнения.
- untrap_signal(signal, id)
Удаляет ранее зарегистрированный
signalсid.- user_home()
Директория домашней папки пользователя.
- user_home!()
Директория домашней папки пользователя, исключение при ошибке.
- version()
Информация о версии Elixir.
- wait_until_booted()
Ожидает загрузки системы.
Типы
signal()Source
@type signal() :: :sigabrt | :sigalrm | :sigchld | :sighup | :sigquit | :sigstop | :sigterm | :sigtstp | :sigusr1 | :sigusr2
time_unit()Source
@type time_unit() :: :second | :millisecond | :microsecond | :nanosecond | pos_integer()
Единица измерения времени, передаваемая в функции, такие как monotonic_time/1, и другие.
Единицы измерения времени :second, :millisecond, :microsecond и :nanosecond контролируют возвращаемое значение функций, принимающих единицу измерения времени.
Единица измерения времени также может быть строго положительным целым числом. В этом случае она представляет «части в секунду»: время будет возвращено в 1 / parts_per_second секундах. Например, использование единицы измерения :millisecond эквивалентно использованию 1000 в качестве единицы измерения (так как время будет возвращено в 1/1000 секунды — миллисекунды).
Функции
argv()Source
@spec argv() :: [String.t()]
Список аргументов командной строки.
Возвращает список аргументов командной строки, переданных программе.
argv(args)Source
@spec argv([String.t()]) :: :ok
Изменяет аргументы командной строки.
Изменяет список аргументов командной строки. Используйте с осторожностью, так как это приводит к уничтожению любой предыдущей информации argv.
at_exit(fun)Source
@spec at_exit((non_neg_integer() -> any())) :: :ok
Регистрирует функцию обработчика завершения программы.
Регистрирует функцию, которая будет вызвана в конце скрипта Elixir. Скрипт обычно запускается через командную строку с помощью исполняемых файлов elixir и mix.
Обработчик всегда выполняется в другом процессе, отличном от того, в котором он был зарегистрирован. Вследствие этого, любые ресурсы, управляемые вызывающим процессом (таблицы ETS, открытые файлы и другие), не будут доступны к моменту вызова функции обработчика.
Функция должна принимать код возврата выхода в качестве аргумента.
Если VM завершает программу программно, через System.stop/1, System.halt/1 или сигналы выхода, вызовы at_exit/1 не гарантируются к выполнению.
build_info()Source
@spec build_info() :: %{
build: String.t(),
date: String.t(),
revision: String.t(),
version: String.t(),
otp_release: String.t()
} Информация о сборке Elixir.
Возвращает карту с версией Elixir, выпуском Erlang/OTP, с которым она была скомпилирована, коротким хэшем Git и датой и временем её сборки.
Каждое значение в карте является строкой, и это:
-
:build— версия Elixir, короткий хэш Git и выпуск Erlang/OTP, с которым она была скомпилирована -
:date— строковое представление даты и времени сборки в формате ISO8601 -
:otp_release— выпуск OTP, с которым она была скомпилирована -
:revision— короткий хэш Git. Если Git не был доступен во время сборки, он устанавливается в"" -
:version— версия Elixir
Не следует полагаться на конкретные форматы, возвращаемые каждым из этих полей. Вместо этого следует использовать специализированные функции, такие как version/0 для получения версии Elixir и otp_release/0 для получения выпуска Erlang/OTP.
Примеры
iex> System.build_info()
%{
build: "1.9.0-dev (772a00a0c) (compiled with Erlang/OTP 21)",
date: "2018-12-24T01:09:21Z",
otp_release: "21",
revision: "772a00a0c",
version: "1.9.0-dev"
} cmd(command, args, opts \\ [])Source
@spec cmd(binary(), [binary()], keyword()) ::
{Collectable.t(), exit_status :: non_neg_integer()} Выполняет заданный command с args.
command ожидается как исполняемый файл, доступный в PATH, если не указан абсолютный путь.
args должен быть списком бинарных файлов, которые исполняемый файл получит в качестве аргументов как есть. Это означает:
- переменные окружения не будут интерполированы
- расширение по маске не произойдёт (если
Path.wildcard/2не использован явно) - аргументы не нужно экранировать или заключать в кавычки для безопасности оболочки
Эта функция возвращает кортеж, содержащий собранный результат и код завершения команды.
Внутренне эта функция использует Port для взаимодействия с внешним миром. Однако, если вы планируете запустить долго выполняющуюся программу, порты гарантируют, что устройства stdin/stdout будут закрыты, но не завершат программу автоматически. Документация модуля Port описывает эту проблему и возможные решения в разделе «Процессы-зомби».
Разделение аргументов в Windows и небезопасные аргументы
В Unix-системах аргументы передаются новому процессу операционной системы как массив строк, но в Windows ответственность за их разбор лежит на дочернем процессе, и некоторые программы Windows могут применять свои собственные правила, которые несовместимы со стандартным разбором
argv.Это особенно проблематично при вызове
.batили.comфайлов, так как они неявно выполняются черезcmd.exe, разбор аргументов которого уязвим к вредоносным данным и может использоваться для выполнения произвольных команд оболочки.Поэтому, если вы работаете в Windows и запускаете пакетные файлы или
.comприложения, вы не должны передавать небезопасные данные в качестве аргументов программе. Вы можете избежать случайного их выполнения, явно передавая расширение программы, которую вы хотите запустить, например,.exe, и дважды убедиться, что программа на самом деле не является пакетным файлом или.comприложением.
Примеры
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())
hello
{%IO.Stream{}, 0}
Если вы хотите читать строки:
iex> System.cmd("echo", ["hello\nworld"], into: [], lines: 1024)
{["hello", "world"], 0}
Параметры
:into- вставляет результат в заданный коллектор, по умолчанию"":lines- (с версии v1.15.0) читает вывод построчно вместо байтов. Ожидает количество максимальных байтов для внутреннего буферирования (1024 — разумное значение по умолчанию). Коллектор будет вызываться с каждой завершённой строкой (независимо от размера буфера) и без символа EOL:cd- каталог для выполнения команды:env- перечисляемый список кортежей, содержащих пары ключ-значение переменных окружения в бинарном формате. Дочерний процесс наследует все переменные окружения от родительского процесса, приложения Elixir, за исключением тех, которые перезаписаны или очищены с помощью этого параметра. Установите значениеnilдля очистки (удаления) переменной окружения, что полезно для предотвращения утечки данных авторизации в дочерние процессы:arg0- устанавливает arg0 команды:stderr_to_stdout- перенаправляет stderr в stdout приtrue:parallelism- когдаtrue, виртуальная машина запланирует задачи порта для повышения параллелизма в системе. Если установлено значениеfalse, виртуальная машина попытается выполнить команды немедленно, улучшая задержки за счёт параллелизма. По умолчанию значениеfalse, и может быть установлено при запуске системы, передав флаг+sppв--erl. Используйте:erlang.system_info(:port_parallelism)для проверки включения.
Причины ошибок
При передаче некорректных аргументов, ArgumentError поднимается функцией System.cmd/3. System.cmd/3 также ожидает строгий набор опций и поднимет исключение при передаче неизвестных или некорректных опций.
Кроме того, System.cmd/3 может завершиться ошибкой по одной из POSIX причин, описанных ниже:
:system_limit- все доступные порты в эмуляторе Erlang заняты:enomem- не хватило памяти для создания порта:eagain- больше нет доступных процессов операционной системы:enametoolong- внешняя команда была слишком длинной:emfile- больше нет доступных дескрипторов файлов (для процесса операционной системы, в котором работает эмулятор Erlang):enfile- таблица файлов заполнена (для всей операционной системы):eacces- команда не указывает на исполняемый файл:enoent- команда не указывает на существующий файл
Команды оболочки
Если вы хотите выполнить надёжную команду внутри оболочки с использованием труб, перенаправлений и так далее, обратитесь к shell/2.
compiled_endianness()Source
@spec compiled_endianness() :: :little | :big
Возвращает порядок байтов, с которым был скомпилирован системный модуль.
convert_time_unit(time, from_unit, to_unit)Source
@spec convert_time_unit(integer(), time_unit() | :native, time_unit() | :native) :: integer()
Преобразует значение времени time из единицы измерения from_unit в единицу измерения to_unit.
Результат округляется вниз с помощью функции floor.
convert_time_unit/3 принимает дополнительную единицу измерения времени (кроме тех, которые определены в типе time_unit/0), называемую :native. :native — это единица измерения времени, используемая системным модулем Erlang. Она определяется при запуске модуля и остается неизменной до его остановки, но может отличаться при следующем запуске на одном и том же компьютере. Поэтому следует использовать эту функцию для преобразования значений времени в предсказуемые единицы перед отображением их пользователю.
Чтобы определить, сколько секунд представляет собой единица измерения :native в текущей среде выполнения, можно вызвать эту функцию, преобразуя 1 секунду в единицу измерения :native: System.convert_time_unit(1, :second, :native).
cwd()Source
@spec cwd() :: String.t() | nil
Текущая рабочая директория.
Возвращает текущую рабочую директорию или nil если она недоступна.
cwd!()Source
@spec cwd!() :: String.t()
Текущая рабочая директория, исключение при ошибке.
Возвращает текущую рабочую директорию или вызывает исключение RuntimeError.
delete_env(varname)Source
@spec delete_env(String.t()) :: :ok
Удаляет переменную окружения.
Удаляет переменную varname из окружения.
endianness()Source
@spec endianness() :: :little | :big
Возвращает порядок байтов.
fetch_env(varname)Source
@spec fetch_env(String.t()) :: {:ok, String.t()} | :error Возвращает значение заданной переменной окружения или :error если она не найдена.
Если переменная окружения varname установлена, то возвращается {:ok, value}, где value — строка. Если varname не установлена, возвращается :error.
Примеры
iex> System.fetch_env("PORT")
{:ok, "4000"}
iex> System.fetch_env("NOT_SET")
:error fetch_env!(varname)Source
@spec fetch_env!(String.t()) :: String.t()
Возвращает значение заданной переменной окружения или вызывает исключение, если она не найдена.
Аналогично get_env/1, но вместо возвращения nil при отсутствии переменной, вызывает исключение.
Примеры
iex> System.fetch_env!("PORT")
"4000"
iex> System.fetch_env!("NOT_SET")
** (System.EnvError) could not fetch environment variable "NOT_SET" because it is not set find_executable(program)Source
@spec find_executable(binary()) :: binary() | nil
Находит исполняемый файл в системе.
Эта функция ищет исполняемый файл по его имени, используя переменную окружения PATH в Windows и Unix-подобных системах. Она также учитывает правильное расширение исполняемого файла для каждой операционной системы, поэтому для Windows она будет искать файлы с расширениями .com, .cmd или аналогичными.
get_env()Source
@spec get_env() :: %{optional(String.t()) => String.t()} Возвращает все системные переменные окружения.
Возвращаемое значение — это карта, содержащая пары имя-значение. Имена переменных и их значения — это строки.
get_env(varname, default \\ nil)Source
@spec get_env(String.t(), String.t()) :: String.t()
@spec get_env(String.t(), nil) :: String.t() | nil
Возвращает значение заданной переменной окружения.
Возвращаемое значение переменной окружения varname — это строка. Если переменная окружения не задана, возвращает строку, указанную в default или nil, если она не указана.
Примеры
iex> System.get_env("PORT")
"4000"
iex> System.get_env("NOT_SET")
nil
iex> System.get_env("NOT_SET", "4001")
"4001" get_pid()Source
@spec get_pid() :: binary()
Идентификатор процесса Erlang VM.
Возвращает идентификатор процесса текущего эмулятора Erlang в формате, наиболее часто используемом средой операционной системы.
Для получения дополнительной информации см. :os.getpid/0.
halt(status \\ 0)Source
@spec halt(non_neg_integer() | binary() | :abort) :: no_return()
Немедленно завершает работу системы выполнения Erlang.
Прерывает работу системы выполнения Erlang без надлежащего завершения работы приложений и портов. Пожалуйста, обратитесь к stop/1 для аккуратного завершения работы системы.
status должно быть целым числом без знака, атомом :abort или бинарным значением.
Если целое число, система выполнения выходит с целым значением, которое возвращается операционной системе.
Если
:abort, система выполнения прерывается, создавая дамп ядра, если это включено в операционной системе.Если строка, создаётся дамп аварийной остановки Erlang со статусом в качестве слогана, а затем система выполнения выходит со статусом 1.
Обратите внимание, что во многих платформах операционная система поддерживает только коды статуса 0-255.
Для получения дополнительной информации см. :erlang.halt/1.
Примеры
System.halt(0) System.halt(1) System.halt(:abort)
monotonic_time()Source
@spec monotonic_time() :: integer()
Возвращает текущее монотонное время в :native единицах времени.
Это время монотонно увеличивается и начинается в неопределённый момент времени. Это не строго монотонно увеличивается. Несколько последовательных вызовов функции могут вернуть одно и то же значение.
Встраивается компилятором.
monotonic_time(unit)Source
@spec monotonic_time(time_unit()) :: integer()
Возвращает текущее монотонное время в заданной единице времени.
Это время монотонно увеличивается и начинается в неопределённый момент времени.
no_halt()Source
@spec no_halt() :: boolean()
Проверяет, будет ли система завершена после обработки ARGV.
no_halt(boolean)Source
@spec no_halt(boolean()) :: :ok
Помечает, должна ли система завершиться или нет после обработки ARGV.
os_time()Source
@spec os_time() :: integer()
Возвращает текущее время операционной системы (ОС).
Результат возвращается в :native единицах времени.
Это время может быть скорректировано вперёд или назад во времени без ограничений и не является монотонным.
Встраивается компилятором.
os_time(unit)Source
@spec os_time(time_unit() | :native) :: integer()
Возвращает текущее время операционной системы (ОС) в заданном формате unit.
Это время может быть скорректировано вперёд или назад во времени без ограничений и не является монотонным.
otp_release()Source
@spec otp_release() :: String.t()
Возвращает номер версии Erlang/OTP.
pid()Source
@spec pid() :: String.t()
Возвращает идентификатор процесса (PID) операционной системы для текущего экземпляра Erlang.
Возвращает строку, содержащую (обычно) числовой идентификатор процесса. В операционных системах Unix-подобных системах это обычно значение, возвращаемое функцией getpid() вызова системной функции. В Windows используется идентификатор процесса, возвращаемый функцией GetCurrentProcessId() вызова системной функции.
Примеры
System.pid()
put_env(enum)Source
@spec put_env(Enumerable.t()) :: :ok
Устанавливает несколько переменных окружения.
Устанавливает новое значение для каждой переменной окружения, соответствующей каждой {key, value} паре в enum. Ключи и ненулевые значения автоматически преобразуются в charlist. nil значения удаляют соответствующие ключи.
В целом, это удобная обертка вокруг put_env/2 и delete_env/2 с поддержкой различных форматов ключей и значений.
put_env(varname, value)Source
@spec put_env(binary(), binary()) :: :ok
Устанавливает значение переменной окружения.
Устанавливает новое value для переменной окружения varname.
restart()Source
@spec restart() :: :ok
Перезапускает все приложения в системе Erlang.
Все приложения останавливаются плавно, весь код загружается, и все порты закрываются перед повторным запуском всех приложений.
Примеры
System.restart()
schedulers()Source
@spec schedulers() :: pos_integer()
Возвращает количество планировщиков в виртуальной машине.
schedulers_online()Source
@spec schedulers_online() :: pos_integer()
Возвращает количество работающих планировщиков в виртуальной машине.
shell(command, opts \\ [])Source
@spec shell(
binary(),
keyword()
) :: {Collectable.t(), exit_status :: non_neg_integer()} Выполняет данную command в командной оболочке ОС.
Использует sh для систем Unix-подобных и cmd для Windows.
Внимание
Используйте эту функцию с осторожностью. В частности, никогда не передавайте недоверенные данные пользователя в эту функцию, так как пользователь сможет выполнить "атаки с подменой команд", выполнив любой код напрямую на компьютере. В целом, предпочтительнее использовать
cmd/3вместо этой функции.
Примеры
iex> System.shell("echo hello")
{"hello\n", 0}
Если вы хотите передать вывод в стандартный ввод по мере его поступления:
iex> System.shell("echo hello", into: IO.stream())
hello
{%IO.Stream{}, 0}
Параметры
Она принимает те же параметры, что и cmd/3 (кроме arg0). Она также принимает следующие эксклюзивные параметры:
-
:close_stdin(с версии v1.14.1) — если ввод stdin должен быть закрыт в системах Unix, заставляя любую команду, ожидающую ввода stdin, немедленно завершиться. По умолчанию false.
stacktrace()Source
Устаревший механизм получения последнего стека исключений.
Он всегда возвращает пустой список.
stop(status \\ 0)Source
@spec stop(non_neg_integer() | binary()) :: :ok
Асинхронно и аккуратно останавливает систему выполнения Erlang.
Все приложения закрываются плавно, весь код загружается, и все порты закрываются перед завершением системы вызовом halt/1.
status должно быть неотрицательным целым числом или бинарной строкой.
Если целое число, система выполнения завершается с целым значением, которое возвращается операционной системе. На многих платформах операционная система поддерживает только коды статуса 0-255.
Если бинарная строка, создаётся дамп сбоя Erlang со статусом как слоган, а затем система выполнения завершается с кодом статуса 1.
Обратите внимание, что эта функция асинхронна, и текущий процесс продолжит выполнение после вызова этой функции. В случае, если вы хотите заблокировать текущий процесс до фактического завершения системы, вы можете вызвать Process.sleep(:infinity).
Примеры
System.stop(0) System.stop(1)
system_time()Source
@spec system_time() :: integer()
Возвращает текущее системное время в :native единицах времени.
Это представление времени с точки зрения виртуальной машины (os_time/0). Они могут не совпадать в случае временных искажений, хотя виртуальная машина стремится их согласовать. Это время не монотонное.
Встроено компилятором.
system_time(unit)Source
@spec system_time(time_unit()) :: integer()
Возвращает текущее системное время в заданных единицах времени.
Это представление времени с точки зрения виртуальной машины (os_time/0). Они могут не совпадать в случае временных искажений, хотя виртуальная машина стремится их согласовать. Это время не монотонное.
time_offset()Source
@spec time_offset() :: integer()
Возвращает текущий временной сдвиг между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
Результат возвращается в :native единицах времени.
См. time_offset/1 для получения дополнительной информации.
Встроено компилятором.
time_offset(unit)Source
@spec time_offset(time_unit()) :: integer()
Возвращает текущий временной сдвиг между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
Результат возвращается в заданных единицах времени unit. Возвращаемый сдвиг, добавленный к монотонному времени Erlang (например, полученному с помощью monotonic_time/1), даёт системное время Erlang, соответствующее этому монотонному времени.
tmp_dir()Source
@spec tmp_dir() :: String.t() | nil
Каталог временных файлов для записи.
Возвращает каталог временных файлов для записи. Поиск каталогов происходит в следующем порядке:
- каталог, указанный переменной окружения TMPDIR
- каталог, указанный переменной окружения TEMP
- каталог, указанный переменной окружения TMP
-
C:\TMPв Windows или/tmpв Unix-подобных операционных системах - в качестве крайнего варианта, текущий рабочий каталог
Возвращает nil если ни один из вышеперечисленных не является каталогом для записи.
tmp_dir!()Source
@spec tmp_dir!() :: String.t()
Каталог временных файлов для записи, исключение при ошибке.
То же, что и tmp_dir/0, но генерирует исключение RuntimeError вместо возвращения nil если временный каталог не задан.
trap_signal(signal, id \\ make_ref(), fun)Source
@spec trap_signal(signal(), id, (-> :ok)) ::
{:ok, id} | {:error, :already_registered} | {:error, :not_sup}
when id: term() Перехватывает указанный signal для выполнения fun.
Избегайте установки перехватов в библиотеках
Перехват сигналов может существенно повлиять на то, как система завершается и ведет себя в рабочей среде, и поэтому крайне не рекомендуется устанавливать собственные перехваты в библиотеках. Вместо этого библиотеки должны перенаправлять пользователей на самостоятельную настройку. Единственные случаи, когда библиотеки могут устанавливать собственные перехваты, — это использование Elixir в режиме скрипта, например, в файлах
.exsи через задачи Mix.
Можно указать необязательный id, который уникально идентифицирует функцию; в противном случае генерируется уникальный идентификатор. Если ранее был зарегистрирован id, эта функция возвращает кортеж ошибки. id может быть использован для удаления зарегистрированного сигнала, вызвав untrap_signal/2.
Переданная fun функция не принимает аргументов и должна возвращать :ok.
Возвращает {:ok, id} в случае успеха, {:error, :already_registered} если идентификатор уже зарегистрирован для данного сигнала или {:error, :not_sup} если перехват сигналов не поддерживается текущей ОС.
При первом перехвате сигнала будет переопределено стандартное поведение операционной системы. Если один и тот же сигнал перехватывается несколько раз, последующие функции, переданные в trap_signal, будут выполняться сначала. Другими словами, можно представить, что каждая функция добавляется в начало обработчика сигнала.
По умолчанию виртуальная машина Erlang регистрирует перехваты для трёх сигналов:
-
:sigstop— вежливо завершает работу VM сstop/0 -
:sigquit— останавливает VM черезhalt/0 -
:sigusr1— останавливает VM со статусом 1
Поэтому, если вы добавляете перехваты к указанным сигналам, стандартное поведение будет выполнено после всех пользовательских сигналов.
Примечания по реализации
Все сигналы выполняются из одного процесса. Следовательно, блокировка fun заблокирует последующие перехваты. Также невозможно добавить или удалить перехваты внутри самого перехвата.
Внутренне эта функциональность основана на :os.set_signal/2. При регистрации перехвата Elixir автоматически устанавливает его в :handle, а затем восстанавливает значение до :default после удаления всех перехватов (кроме :sigquit, :sigterm, и :sigusr1, которые всегда обрабатываются). Если вы или библиотека вызываете :os.set_signal/2 напрямую, это может отключить перехваты Elixir (или Elixir может переопределить вашу настройку).
unique_integer(modifiers \\ [])Source
@spec unique_integer([:positive | :monotonic]) :: integer()
Генерирует и возвращает целое число, уникальное в текущей среде выполнения.
«Уникальность» означает, что эта функция, вызываемая с тем же списком modifiers, никогда не вернёт одно и то же целое число более одного раза в текущей среде выполнения.
Если modifiers является [], то возвращается уникальное целое число (которое может быть положительным или отрицательным). Другие модификаторы могут быть переданы для изменения свойств возвращаемого целого числа:
-
:positive— возвращаемое целое число гарантированно положительное. -
:monotonic— возвращаемое целое число монотонно возрастает. Это означает, что в той же среде выполнения (но даже в разных процессах) целые числа, возвращаемые с помощью модификатора:monotonic, всегда будут строго меньше, чем целые числа, возвращаемые последующими вызовами с модификатором:monotonic.
Все перечисленные модификаторы могут быть объединены; повторяющиеся модификаторы в modifiers будут игнорироваться.
Встроен в компилятор.
untrap_signal(signal, id)Source
@spec untrap_signal(signal(), id) :: :ok | {:error, :not_found} when id: term() Удаляет ранее зарегистрированный signal с id.
user_home()Source
@spec user_home() :: String.t() | nil
Директория пользователя по умолчанию.
Возвращает домашнюю директорию пользователя (независимо от платформы).
user_home!()Source
@spec user_home!() :: String.t()
Директория домашнего пользователя, исключение при ошибке.
То же, что и user_home/0, но вызывает RuntimeError вместо возвращения nil если домашняя директория пользователя не задана.
version()Source
@spec version() :: String.t()
Информация о версии Elixir.
Возвращает версию Elixir в виде двоичного значения.
wait_until_booted()Source
@spec wait_until_booted() :: :ok
Ожидает загрузки системы.
Вызов этой функции блокирует выполнение, пока не будут обработаны все аргументы ARGV. В релизе это означает, что будут обработаны скрипт запуска и затем ARGV. Это полезно только для тех, кто реализует собственные оболочки/консоли поверх Elixir.
Однако будьте осторожны, чтобы не вызывать эту команду из процесса, обрабатывающего аргументы командной строки, так как это может привести к тупиковой ситуации.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/System.html