Spec-Zone.ru › OCaml

Модуль Unix

module Unix: sig .. end

Интерфейс к системе Unix.

Для использования меченной версии этого модуля, добавьте module Unix = UnixLabels в вашей реализации.

Примечание: все функции этого модуля (кроме Unix.error_message и Unix.handle_unix_error) могут генерировать исключение Unix.Unix_error, когда системный вызов сообщает об ошибке.

Отчет об ошибках

type error = 
| E2BIG (*

Список аргументов слишком длинный

*)
| EACCES (*

Доступ запрещен

*)
| EAGAIN (*

Ресурс временно недоступен; попробуйте снова

*)
| EBADF (*

Неверный дескриптор файла

*)
| EBUSY (*

Ресурс недоступен

*)
| ECHILD (*

Нет дочернего процесса

*)
| EDEADLK (*

Возникла тупиковая ситуация с ресурсами

*)
| EDOM (*

Ошибка области определения для математических функций и т.п.

*)
| EEXIST (*

Файл существует

*)
| EFAULT (*

Неверный адрес

*)
| EFBIG (*

Файл слишком большой

*)
| EINTR (*

Функция прервана сигналом

*)
| EINVAL (*

Неверный аргумент

*)
| EIO (*

Ошибка ввода-вывода оборудования

*)
| EISDIR (*

Это директория

*)
| EMFILE (*

Процесс открыл слишком много файлов

*)
| EMLINK (*

Слишком много ссылок

*)
| ENAMETOOLONG (*

Имя файла слишком длинное

*)
| ENFILE (*

В системе слишком много открытых файлов

*)
| ENODEV (*

Устройство не найдено

*)
| ENOENT (*

Файл или директория не найдены

*)
| ENOEXEC (*

Не выполнимый файл

*)
| ENOLCK (*

Блокировки недоступны

*)
| ENOMEM (*

Недостаточно памяти

*)
| ENOSPC (*

На устройстве закончилось место

*)
| ENOSYS (*

Функция не поддерживается

*)
| ENOTDIR (*

Это не каталог

*)
| ENOTEMPTY (*

Каталог не пуст

*)
| ENOTTY (*

Неподходящая операция управления вводом-выводом

*)
| ENXIO (*

Такого устройства или адреса нет

*)
| EPERM (*

Операция запрещена

*)
| EPIPE (*

Разрыв канала

*)
| ERANGE (*

Результат слишком большой

*)
| EROFS (*

Файловая система только для чтения

*)
| ESPIPE (*

Неверный поиск, например, в канале

*)
| ESRCH (*

Процесс не найден

*)
| EXDEV (*

Неверная ссылка

*)
| EWOULDBLOCK (*

Операция заблокирует выполнение

*)
| EINPROGRESS (*

Операция уже выполняется

*)
| EALREADY (*

Операция уже в процессе

*)
| ENOTSOCK (*

Операция сокета выполняется на элементе, не являющемся сокетом

*)
| EDESTADDRREQ (*

Требуется адрес назначения

*)
| EMSGSIZE (*

Сообщение слишком длинное

*)
| EPROTOTYPE (*

Неправильный тип протокола для сокета

*)
| ENOPROTOOPT (*

Протокол недоступен

*)
| EPROTONOSUPPORT (*

Протокол не поддерживается

*)
| ESOCKTNOSUPPORT (*

Тип сокета не поддерживается

*)
| EOPNOTSUPP (*

Операция не поддерживается для сокета

*)
| EPFNOSUPPORT (*

Семейство протоколов не поддерживается

*)
| EAFNOSUPPORT (*

Семейство адресов не поддерживается семейством протоколов

*)
| EADDRINUSE (*

Адрес уже используется

*)
| EADDRNOTAVAIL (*

Запрошенный адрес не может быть назначен

*)
| ENETDOWN (*

Сеть отключена

*)
| ENETUNREACH (*

Сеть недоступна

*)
| ENETRESET (*

Сеть разорвала соединение при сбросе

*)
| ECONNABORTED (*

Программное обеспечение вызвало прерывание соединения

*)
| ECONNRESET (*

Соединение сброшено удаленным узлом

*)
| ENOBUFS (*

Нет доступного буферного пространства

*)
| EISCONN (*

Сокет уже подключен

*)
| ENOTCONN (*

Сокет не подключен

*)
| ESHUTDOWN (*

Отправка невозможна после закрытия сокета

*)
| ETOOMANYREFS (*

Слишком много ссылок: нельзя соединить

*)
| ETIMEDOUT (*

Таймаут соединения

*)
| ECONNREFUSED (*

Соединение отклонено

*)
| EHOSTDOWN (*

Узел не активен

*)
| EHOSTUNREACH (*

Маршрут к узлу отсутствует

*)
| ELOOP (*

Слишком много уровней символических ссылок

*)
| EOVERFLOW (*

Размер или позиция файла не представимы

*)
| EUNKNOWNERR of int (*

Неизвестная ошибка

*)

Тип кодов ошибок. Ошибки, определённые в стандарте POSIX, и дополнительные ошибки из UNIX98 и BSD. Все другие ошибки отображаются как EUNKNOWNERR.

exception Unix_error of error * string * string

Вызываются системными вызовами ниже, когда возникает ошибка. Первый компонент — код ошибки; второй — имя функции; третий — строковый параметр функции, если он есть, или пустая строка в противном случае.

UnixLabels.Unix_error и Unix.Unix_error одинаковы, и перехват одной из них перехватывает и другую.

val error_message : error -> string

Возвращает строку, описывающую данный код ошибки.

val handle_unix_error : ('a -> 'b) -> 'a -> 'b

handle_unix_error f x применяет f к x и возвращает результат. Если возникает исключение Unix.Unix_error, выводится сообщение об ошибке и программа завершается с кодом 2.

Доступ к среде процесса

val environment : unit -> string array

Возвращает среду процесса в виде массива строк формата «переменная=значение». Возвращаемый массив пуст, если у процесса есть специальные привилегии.

val unsafe_environment : unit -> string array

Возвращает среду процесса в виде массива строк формата «переменная=значение». В отличие от Unix.environment, эта функция возвращает заполненный массив даже если у процесса есть специальные привилегии. Подробнее см. документацию по Unix.unsafe_getenv.

  • Since 4.06 (4.12 в UnixLabels)
val getenv : string -> string

Возвращает значение, связанное с переменной в среде процесса, если у процесса нет специальных привилегий.

  • Raises Not_found если переменная не определена или у процесса есть специальные привилегии. Эта функция идентична Sys.getenv.
val unsafe_getenv : string -> string

Возвращает значение, связанное с переменной в среде процесса.

В отличие от Unix.getenv, эта функция возвращает значение даже если у процесса есть особые привилегии. Она считается небезопасной, так как программист программы с установленным setuid или setgid должен быть осторожен, чтобы избежать использования злонамеренно созданных переменных среды в пути поиска исполняемых файлов, расположении временных файлов или журналов и т. п.

  • Since 4.06
  • Raises Not_found если переменная не определена.
val putenv : string -> string -> unit

putenv name value устанавливает значение, связанное с переменной в среде процесса. name — имя переменной среды, а value — её новое значение.

Обработка процессов

type process_status = 
| WEXITED of int (*

Процесс завершился нормально с кодом exit; аргументом является код возврата.

*)
| WSIGNALED of int (*

Процесс был завершен сигналом; аргументом является номер сигнала.

*)
| WSTOPPED of int (*

Процесс был приостановлен сигналом; аргументом является номер сигнала.

*)

Код завершения процесса. См. модуль Sys для определений стандартных номеров сигналов. Обратите внимание, что они не являются числами, используемыми ОС.

В Windows: используется только WEXITED (так как нет межпроцессных сигналов), но с определенными кодами возврата для указания особых причин завершения. Ищите значения NTSTATUS в документации Windows, чтобы расшифровать такие коды возврата ошибок. В частности, код ошибки STATUS_ACCESS_VIOLATION — 32-битный 0xC0000005; так как Int32.of_int 0xC0000005 является -1073741819, WEXITED -1073741819 — это аналог WSIGNALED Sys.sigsegv в Windows.

type wait_flag = 
| WNOHANG (*

Не блокировать, если ни один дочерний процесс еще не завершился, а сразу вернуть значение pid, равное 0.

*)
| WUNTRACED (*

Отчитываться также о дочерних процессах, получивших сигналы остановки.

*)

Флаги для Unix.waitpid.

val execv : string -> string array -> 'a

execv prog args выполнить программу в файле prog, с аргументами args, и текущей средой процесса. Обратите внимание, что первый аргумент, args.(0), по соглашению является именем файла исполняемой программы, как и Sys.argv.(0). Эти execv* функции никогда не возвращаются: при успехе текущая программа заменяется новой.

В Windows: CRT просто запускает новый процесс и завершает текущий. Это приведет к нежелательным последствиям, если, например, другой процесс ожидает текущего. Рекомендуется использовать Unix.create_process или одну из open_process_* функций вместо этого.

  • Raises Unix_error при ошибке
val execve : string -> string array -> string array -> 'a

Аналогично Unix.execv, за исключением того, что третий аргумент предоставляет среду выполняемой программе.

val execvp : string -> string array -> 'a

Аналогично Unix.execv, за исключением того, что программа ищется в пути.

val execvpe : string -> string array -> string array -> 'a

Аналогично Unix.execve, за исключением того, что программа ищется в пути.

val fork : unit -> int

Создать новый процесс. Возвращаемое целое число равно 0 для дочернего процесса и pid дочернего процесса для родительского процесса. Возникает ошибка, если процесс OCaml многоядерный (был запущен какой-либо домен). Кроме того, если был запущен любой поток из модуля Thread, дочерний процесс может оказаться в поврежденном состоянии.

  • Raises
    • Invalid_argument в Windows. Используйте Unix.create_process или потоки вместо этого.
    • Failure если был запущен какой-либо домен.
val wait : unit -> int * process_status

Ожидать, пока один из дочерних процессов завершит работу, и вернуть его pid и код завершения.

  • Raises Invalid_argument в Windows. Используйте Unix.waitpid вместо этого.
val waitpid : wait_flag list -> int -> int * process_status

Аналогично Unix.wait, но ожидает дочерний процесс с заданным pid. Pid, равный -1, означает ожидание любого дочернего процесса. Pid, равный 0, означает ожидание любого дочернего процесса в той же группе процессов, что и текущий процесс. Отрицательные значения pid представляют группы процессов. Список опций указывает, должен ли waitpid возвращаться немедленно без ожидания и должен ли он сообщать об остановленных дочерних процессах.

В Windows: можно ожидать только для заданного PID, а не для любого дочернего процесса.

val system : string -> process_status

Выполнить данную команду, дождаться её завершения и вернуть код завершения. Строка интерпретируется оболочкой /bin/sh (или интерпретатором команд cmd.exe в Windows) и поэтому может содержать перенаправления, кавычки, переменные и т. д. Для правильного экранирования пробелов и специальных символов оболочки, встречающихся в именах файлов или аргументах команд, рекомендуется использовать Filename.quote_command. Результат WEXITED 127 указывает, что оболочка не смогла выполниться.

val _exit : int -> 'a

Немедленно завершить вызывающий процесс, вернув указанный код состояния операционной системе: обычно 0 для обозначения отсутствия ошибок и небольшое положительное целое число для обозначения ошибки. В отличие от exit, Unix._exit не выполняет никакой финализации: функции, зарегистрированные с at_exit, не вызываются, каналы ввода/вывода не сбрасываются, и система времени выполнения C не завершается.

Типичное использование Unix._exit — после операции Unix.fork, когда дочерний процесс сталкивается с критическим ошибкой и должен выйти. В этом случае предпочтительно не выполнять никаких финализирующих действий в дочернем процессе, так как эти действия могут вмешиваться в аналогичные действия, выполняемые родительским процессом. Например, каналы вывода не должны сбрасываться дочерним процессом, так как родительский процесс может сбросить их позже, что приведет к дублированию вывода.

  • Since 4.12
val getpid : unit -> int

Возвращает pid процесса.

val getppid : unit -> int

Возвращает pid родительского процесса.

  • Raises Invalid_argument в Windows (потому что это не имеет смысла)
val nice : int -> int

Изменить приоритет процесса. Целое число аргумента добавляется к значению «nice» (большие значения «nice» означают меньший приоритет). Возвращается новое значение nice.

  • Raises Invalid_argument в Windows

Основные операции ввода/вывода с файлами

type file_descr 

Абстрактный тип дескрипторов файлов.

val stdin : file_descr

Дескриптор стандартного ввода.

val stdout : file_descr

Дескриптор стандартного вывода.

val stderr : file_descr

Дескриптор стандартной ошибки.

type open_flag = 
| O_RDONLY (*

Открыто для чтения

*)
| O_WRONLY (*

Открыто для записи

*)
| O_RDWR (*

Открыто для чтения и записи

*)
| O_NONBLOCK (*

Открыто в асинхронном режиме

*)
| O_APPEND (*

Открыто для добавления

*)
| O_CREAT (*

Создать, если не существует

*)
| O_TRUNC (*

Обрезать до длины 0, если существует

*)
| O_EXCL (*

Не удается, если существует

*)
| O_NOCTTY (*

Не делать текущий терминал управляющим

*)
| O_DSYNC (*

Запись завершена как «синхронизированная целостность данных I/O»

*)
| O_SYNC (*

Запись завершена как «синхронизированная целостность файла I/O»

*)
| O_RSYNC (*

Чтение завершено как запись (в зависимости от O_SYNC/O_DSYNC)

*)
| O_SHARE_DELETE (*

Только Windows: разрешить удаление файла при открытии

*)
| O_CLOEXEC (*

Устанавливает флаг close-on-exec для дескриптора, возвращённого Unix.openfile. Дополнительная информация в Unix.set_close_on_exec.

*)
| O_KEEPEXEC (*

Сбросить флаг close-on-exec. В настоящее время это значение по умолчанию.

*)

Флаги для Unix.openfile.

type file_perm = int 

Тип прав доступа к файлу, например, 0o640 — чтение и запись для пользователя, чтение для группы, нет для других

val openfile : string -> open_flag list -> file_perm -> file_descr

Открыть именованный файл с заданными флагами. Третий аргумент — права доступа к файлу при создании (см. Unix.umask). Возвращает дескриптор файла.

val close : file_descr -> unit

Закрыть дескриптор файла.

val fsync : file_descr -> unit

Очистить буферы файла в диск.

  • Since 4.08 (4.12 в UnixLabels)
val read : file_descr -> bytes -> int -> int -> int

read fd buf pos len считывает len байт из дескриптора fd, сохраняя их в последовательности байтов buf, начиная с позиции pos в buf. Возвращает количество фактически прочитанных байтов.

val read_bigarray : file_descr ->       ('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)       Bigarray.Array1.t -> int -> int -> int

То же, что и Unix.read, но считывает данные в bigarray.

  • Since 5.2
val write : file_descr -> bytes -> int -> int -> int

write fd buf pos len записывает len байта в дескриптор fd, беря их из последовательности байтов buf, начиная с позиции pos в buff. Возвращает количество фактически записанных байтов. write повторяет операцию записи, пока все байты не будут записаны или не произойдёт ошибка.

val write_bigarray : file_descr ->       ('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)       Bigarray.Array1.t -> int -> int -> int

То же, что и Unix.write, но данные берутся из bigarray.

  • Since 5.2
val single_write : file_descr -> bytes -> int -> int -> int

То же, что и Unix.write, но пытается записать только один раз. Таким образом, если произойдёт ошибка, single_write гарантирует, что данные не были записаны.

val write_substring : file_descr -> string -> int -> int -> int

То же, что и Unix.write, но данные берутся из строки вместо последовательности байтов.

  • Since 4.02
val single_write_substring : file_descr -> string -> int -> int -> int

То же, что и Unix.single_write, но данные берутся из строки вместо последовательности байтов.

  • Since 4.02
val single_write_bigarray : file_descr ->       ('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)       Bigarray.Array1.t -> int -> int -> int

То же, что и Unix.single_write, но данные берутся из bigarray.

  • Since 5.2

Взаимодействие с стандартной библиотекой ввода/вывода

val in_channel_of_descr : file_descr -> in_channel

Создайте канал ввода, читающий из данного дескриптора. По умолчанию канал находится в двоичном режиме; используйте set_binary_mode_in ic false для текстового режима. Текстовый режим поддерживается только если дескриптор ссылается на файл или канал, но не поддерживается при ссылке на сокет.

В Windows: set_binary_mode_in всегда завершается ошибкой для каналов, созданных с помощью этой функции.

Обратите внимание, что каналы ввода буферизованы, поэтому может быть прочитано больше символов из дескриптора, чем обработано функциями канала. Каналы также сохраняют копию текущей позиции в файле.

Закрытие канала ic , возвращенного in_channel_of_descr fd, с помощью close_in ic, также закрывает базовый дескриптор fd. Неправильно закрывать как канал ic, так и дескриптор fd.

Если несколько каналов созданы на одном дескрипторе, один из каналов должен быть закрыт, но не остальные. Рассмотрим, например, дескриптор s , подключенный к сокету, и два канала ic = in_channel_of_descr s и oc = out_channel_of_descr s. Рекомендуемый протокол закрытия — выполнить close_out oc, который сбрасывает буферизованный вывод в сокет, а затем закрывает сокет. Канал ic не должен быть закрыт и будет убран сборщиком мусора в конечном итоге.

val out_channel_of_descr : file_descr -> out_channel

Создайте канал вывода, записывающий в данный дескриптор. По умолчанию канал находится в двоичном режиме; используйте set_binary_mode_out oc false для текстового режима. Текстовый режим поддерживается только если дескриптор ссылается на файл или канал, но не поддерживается при ссылке на сокет.

В Windows: set_binary_mode_out всегда завершается ошибкой для каналов, созданных с помощью этой функции.

Обратите внимание, что каналы вывода буферизованы, поэтому вам может потребоваться вызвать flush для гарантии, что все данные были отправлены в дескриптор. Каналы также сохраняют копию текущей позиции в файле.

Закрытие канала oc , возвращенного out_channel_of_descr fd, с помощью close_out oc, также закрывает базовый дескриптор fd. Неправильно закрывать как канал ic, так и дескриптор fd.

См. Unix.in_channel_of_descr для обсуждения протокола закрытия, когда несколько каналов созданы на одном дескрипторе.

val descr_of_in_channel : in_channel -> file_descr

Возвращает дескриптор, соответствующий каналу ввода.

val descr_of_out_channel : out_channel -> file_descr

Возвращает дескриптор, соответствующий каналу вывода.

Поиск и обрезка

type seek_command = 
| SEEK_SET (*

указывает позиции относительно начала файла

*)
| SEEK_CUR (*

указывает позиции относительно текущей позиции

*)
| SEEK_END (*

указывает позиции относительно конца файла

*)

Режимы позиционирования для Unix.lseek.

val lseek : file_descr -> int -> seek_command -> int

Устанавливает текущую позицию для дескриптора файла и возвращает полученный смещение (от начала файла).

val truncate : string -> int -> unit

Обрезает именованный файл до заданного размера.

val ftruncate : file_descr -> int -> unit

Обрезает файл, соответствующий данному дескриптору, до заданного размера.

Статус файла

type file_kind = 
| S_REG (*

Регулярный файл

*)
| S_DIR (*

Директория

*)
| S_CHR (*

Устройство символьного типа

*)
| S_BLK (*

Устройство блочного типа

*)
| S_LNK (*

Символическая ссылка

*)
| S_FIFO (*

Именованная труба

*)
| S_SOCK (*

Сокет

*)
type stats = {
st_dev : int; (*

Номер устройства

*)
st_ino : int; (*

Номер узла

*)
st_kind : file_kind; (*

Тип файла

*)
st_perm : file_perm; (*

Права доступа

*)
st_nlink : int; (*

Количество ссылок

*)
st_uid : int; (*

Идентификатор пользователя владельца

*)
st_gid : int; (*

Идентификатор группы файла

*)
st_rdev : int; (*

Идентификатор устройства (если специальный файл)

*)
st_size : int; (*

Размер в байтах

*)
st_atime : float; (*

Время последнего доступа

*)
st_mtime : float; (*

Время последней модификации

*)
st_ctime : float; (*

Время последнего изменения статуса

*)
}

Информация, возвращаемая вызовами Unix.stat.

val stat : string -> stats

Возвращает информацию о файле с указанным именем.

val lstat : string -> stats

То же, что и Unix.stat, но в случае символической ссылки возвращает информацию о самой ссылке.

val fstat : file_descr -> stats

Возвращает информацию о файле, связанном с заданным дескриптором.

val isatty : file_descr -> bool

Возвращает true если заданный дескриптор файла относится к терминалу или окну консоли, false в противном случае.

Операции с большими файлами

module LargeFile: sig .. end

Операции с большими файлами.

Картирование файлов в память

val map_file : file_descr ->       ?pos:int64 ->       ('a, 'b) Bigarray.kind ->       'c Bigarray.layout ->       bool -> int array -> ('a, 'b, 'c) Bigarray.Genarray.t

Картирование файла в память как Bigarray. map_file fd kind layout shared dims возвращает Bigarray типа kind, макета layout, и размерностей, как указано в dims. Данные в этом Bigarray представляют содержимое файла, на который указывает дескриптор файла fd (открытый ранее с помощью Unix.openfile, например). Необязательный параметр pos — смещение байтов в файле для отображаемых данных; по умолчанию 0 (отображение с начала файла).

Если shared равно true, все изменения, внесенные в массив, отражаются в файле. Это требует, чтобы fd был открыт с разрешением на запись. Если shared равно false, изменения, внесенные в массив, выполняются только в памяти, используя копирование при записи измененных страниц; базовый файл не затрагивается.

Unix.map_file намного эффективнее, чем чтение всего файла в Bigarray, изменение этого Bigarray и последующая запись.

Для автоматической корректировки размерностей Bigarray под фактический размер файла, главная размерность (то есть первая размерность для массива с макетом C и последняя размерность для массива с макетом Fortran) может быть задана как -1. Unix.map_file затем определяет главную размерность из размера файла. Файл должен содержать целое число подмассивов, как определено неглавными размерностями, иначе возникает Failure.

Если все размерности Bigarray заданы, размер файла сопоставляется с размером Bigarray. Если файл больше Bigarray, в Bigarray отображается только начальная часть файла. Если файл меньше Bigarray, файл автоматически расширяется до размера Bigarray. Это требует разрешения на запись для fd.

Доступы к массивам проверяются на границах, но границы определяются начальным вызовом Unix.map_file. Поэтому необходимо убедиться, что ни один другой процесс не изменяет сопоставленный файл во время доступа, иначе может быть вызвано SIGBUS. Это происходит, например, если файл уменьшен.

Invalid_argument или Failure могут быть подняты в случаях, когда проверка аргументов завершается ошибкой.

  • Since 4.06

Операции с именами файлов

val unlink : string -> unit

Удаляет указанный файл.

Если указанный файл является каталогом, возникает:

  • EPERM на POSIX-совместимой системе
  • EISDIR на Linux >= 2.1.132
  • EACCESS на Windows
val rename : string -> string -> unit

rename src dst изменяет имя файла с src на dst, перемещая его между каталогами при необходимости. Если dst уже существует, его содержимое заменится содержимым src . В зависимости от операционной системы, метаданные (разрешения, владелец и т.д.) dst могут быть сохранены или заменены метаданными src.

val link : ?follow:bool -> string -> string -> unit

link ?follow src dst создает жесткую ссылку с именем dst на файл с именем src.

  • Raises
    • ENOSYS На Unix, если требуется ~follow:_, но linkat недоступен.
    • ENOSYS На Windows, если требуется ~follow:false.
follow : указывает, следует ли src символическую ссылку или создать жесткую ссылку на src. На Unix системах это выполняется с помощью функции linkat(2). Если ?follow не предоставлен, то используется функция link(2), поведение которой зависит от ОС, но она более широко доступна.
val realpath : string -> string

realpath p — абсолютный путь к p, полученный путем разрешения всех дополнительных символов /, сегментов относительного пути и символических ссылок.

  • Since 4.13

Права доступа и владение файлами

type access_permission = 
| R_OK (*

Право чтения

*)
| W_OK (*

Право записи

*)
| X_OK (*

Право выполнения

*)
| F_OK (*

Файл существует

*)

Флаги для вызова Unix.access.

val chmod : string -> file_perm -> unit

Изменение разрешений указанного файла.

val fchmod : file_descr -> file_perm -> unit

Изменение разрешений открытого файла.

  • Raises Invalid_argument в Windows
val chown : string -> int -> int -> unit

Изменение владельца и группы владельца указанного файла.

  • Raises Invalid_argument в Windows
val fchown : file_descr -> int -> int -> unit

Изменение владельца и группы владельца открытого файла.

  • Raises Invalid_argument в Windows
val umask : file_perm -> file_perm

Установить и вернуть предыдущее значение маски создания режима файла процесса.

  • Raises Invalid_argument в Windows
val access : string -> access_permission list -> unit

Проверка наличия у процесса указанных разрешений на указанный файл.

В Windows: разрешение на выполнение X_OK проверить нельзя, вместо этого проверяется разрешение на чтение.

  • Raises Unix_error в противном случае.

Операции с дескрипторами файлов

val dup : ?cloexec:bool -> file_descr -> file_descr

Возвращает новый дескриптор файла, ссылающийся на тот же файл, что и заданный дескриптор. См. Unix.set_close_on_exec для документации по необязательному аргументу cloexec.

val dup2 : ?cloexec:bool -> file_descr -> file_descr -> unit

dup2 src dst дублирует src в dst, закрывая dst , если он уже открыт. См. Unix.set_close_on_exec для документации по необязательному аргументу cloexec.

val set_nonblock : file_descr -> unit

Установить флаг «неблокирующего» режима для указанного дескриптора. При установке флага «неблокирующего» режима чтение из дескриптора, для которого временно нет доступных данных, вызывает ошибку EAGAIN или EWOULDBLOCK, вместо блокировки; запись в дескриптор, для которого временно нет места для записи, также вызывает ошибку EAGAIN или EWOULDBLOCK.

val clear_nonblock : file_descr -> unit

Снять флаг «неблокирующего» режима с указанного дескриптора. См. Unix.set_nonblock.

val set_close_on_exec : file_descr -> unit

Установить флаг «закрывать при exec» для данного дескриптора. Дескриптор с флагом «закрывать при exec» автоматически закрывается, когда текущий процесс запускает другую программу с помощью функций exec, create_process и open_process.

Часто утечка дескрипторов файлов, открытых, например, для частного файла во внешнюю программу, является уязвимостью безопасности: программа получает доступ к частному файлу и может совершить нежелательные действия с ним. Поэтому настоятельно рекомендуется устанавливать флаг «закрывать при exec» для всех дескрипторов файлов, за исключением тех редких случаев, когда дескриптор файла фактически нужно передать другой программе.

Лучший способ установить флаг «закрывать при exec» — создать дескриптор в таком состоянии. Для этого функция openfile имеет флаги O_CLOEXEC и O_KEEPEXEC для поддержки режима «закрывать при exec» или «сохранять при exec» соответственно. Все остальные операции в модуле Unix, создающие дескрипторы файлов, имеют необязательный аргумент ?cloexec:bool, чтобы указать, должен ли дескриптор файла создаваться в режиме «закрывать при exec» (написав ~cloexec:true) или в режиме «сохранять при exec» (написав ~cloexec:false). По историческим причинам, режим создания дескриптора файлов по умолчанию — «сохранять при exec», если необязательный аргумент cloexec не указан. Это небезопасный по умолчанию режим, поэтому настоятельно рекомендуется явно указывать аргументы cloexec в операциях создания дескрипторов файлов.

Необязательные аргументы cloexec и флаг O_KEEPEXEC были добавлены в OCaml 4.05. Раньше распространенной практикой было создание дескрипторов файлов в режиме по умолчанию «сохранять при exec», а затем вызов set_close_on_exec для этих только что созданных дескрипторов файлов. Это не так безопасно, как создание дескриптора файла в режиме «закрывать при exec», потому что в многопоточных программах существует окно уязвимости между временем создания дескриптора файла и временем выполнения set_close_on_exec. Если другой поток запускает другую программу в это окно, дескриптор утечет, так как он все еще в режиме «сохранять при exec».

Что касается гарантий атомарности, предоставляемых ~cloexec:true или использованием флага O_CLOEXEC, на всех платформах гарантируется, что одновременно выполняющаяся нить Caml не может утечь дескриптор, запустив новый процесс. В Linux эта гарантия распространяется на одновременно выполняющиеся нити C. По состоянию на февраль 2017 года другим операционным системам не хватает необходимых системных вызовов, и они все еще уязвимы в момент, когда нить C может видеть только что созданный дескриптор файла в режиме «сохранять при exec».

val clear_close_on_exec : file_descr -> unit

Снять флаг «закрывать при exec» с данного дескриптора. См. Unix.set_close_on_exec.

Директории

val mkdir : string -> file_perm -> unit

Создать директорию с заданными разрешениями (см. Unix.umask).

val rmdir : string -> unit

Удалить пустую директорию.

val chdir : string -> unit

Изменить текущую директорию процесса.

val getcwd : unit -> string

Возвратить имя текущей директории.

val chroot : string -> unit

Изменить корневую директорию процесса.

  • Raises Invalid_argument в Windows
type dir_handle 

Тип дескрипторов открытых директорий.

val opendir : string -> dir_handle

Открыть дескриптор директории

val readdir : dir_handle -> string

Возвращает следующую запись в директории.

  • Raises End_of_file при достижении конца директории.
val rewinddir : dir_handle -> unit

Переместить дескриптор к началу директории

val closedir : dir_handle -> unit

Закрыть дескриптор директории.

Каналы и перенаправления

val pipe : ?cloexec:bool -> unit -> file_descr * file_descr

Создать канал. Первый элемент результата открыт для чтения, это выход из канала. Второй элемент открыт для записи, это вход в канал. См. Unix.set_close_on_exec для документации по необязательному аргументу cloexec.

val mkfifo : string -> file_perm -> unit

Создать именованный канал с заданными разрешениями (см. Unix.umask).

  • Raises Invalid_argument в Windows

Управление процессами высокого уровня и перенаправлениями

val create_process : string ->       string array -> file_descr -> file_descr -> file_descr -> int

create_process prog args stdin stdout stderr создает новый процесс, который выполняет программу в файле prog, с аргументами args. Обратите внимание, что первый аргумент, args.(0), по соглашению является именем файла исполняемой программы, как и в Sys.argv.(0). ИД нового процесса возвращается немедленно; новый процесс выполняется параллельно с текущим процессом. Стандартный ввод и выводы нового процесса подключены к дескрипторам stdin, stdout и stderr. Передача, например, Unix.stdout для stdout предотвращает перенаправление и приводит к тому, что у нового процесса будет такой же стандартный вывод, как и у текущего процесса. Исполняемый файл prog ищется в пути. Новый процесс имеет ту же среду, что и текущий процесс.

val create_process_env : string ->       string array ->       string array -> file_descr -> file_descr -> file_descr -> int

create_process_env prog args env stdin stdout stderr работает так же, как Unix.create_process, за исключением того, что дополнительный аргумент env задает среду, передаваемую программе.

val open_process_in : string -> in_channel

Управление каналами и процессами высокого уровня. Эта функция выполняет заданную команду параллельно с программой. Стандартный вывод команды перенаправляется в канал, который можно прочитать через возвращаемый входной канал. Команда интерпретируется оболочкой /bin/sh (или cmd.exe в Windows), см. Unix.system. Функция Filename.quote_command может использоваться для цитирования команды и её аргументов соответствующим образом для используемой оболочки. Если команду не нужно запускать через оболочку, можно использовать Unix.open_process_args_in в качестве более надёжной и эффективной альтернативы Unix.open_process_in.

val open_process_out : string -> out_channel

Аналогично Unix.open_process_in, но перенаправляет стандартный ввод команды в канал. Данные, записанные в возвращаемый выходной канал, отправляются на стандартный ввод команды. Предупреждение: записи в выходные каналы буферизуются, поэтому следует с осторожностью вызывать flush в нужные моменты, чтобы обеспечить правильную синхронизацию. Если команду не нужно запускать через оболочку, можно использовать Unix.open_process_args_out вместо Unix.open_process_out.

val open_process : string -> in_channel * out_channel

Аналогично Unix.open_process_out, но перенаправляет как стандартный ввод, так и стандартный вывод команды в каналы, подключенные к двум возвращаемым каналам. Входной канал подключен к выводу команды, а выходной канал — к вводу команды. Если команду не нужно запускать через оболочку, можно использовать Unix.open_process_args вместо Unix.open_process.

val open_process_full : string ->       string array -> in_channel * out_channel * in_channel

Аналогично Unix.open_process, но второй аргумент указывает среду, передаваемую команде. Результатом является тройка каналов, подключенных соответственно к стандартному выводу, стандартному вводу и стандартной ошибке команды. Если команду не нужно запускать через оболочку, можно использовать Unix.open_process_args_full вместо Unix.open_process_full.

val open_process_args : string -> string array -> in_channel * out_channel

open_process_args prog args выполняет программу prog с аргументами args. Обратите внимание, что первый аргумент, args.(0), по соглашению является именем файла исполняемой программы, как и Sys.argv.(0). Новый процесс выполняется параллельно с текущим процессом. Стандартный ввод и вывод нового процесса перенаправляются в каналы, которые соответственно можно читать и записывать через возвращаемые каналы. Входной канал подключен к выводу программы, а выходной канал — к её вводу.

Предупреждение: записи в выходные каналы буферизуются, поэтому следует с осторожностью вызывать flush в нужные моменты для обеспечения правильной синхронизации.

Исполняемый файл prog ищется в переменной PATH. Это поведение изменилось в версии 4.12; ранее prog искался только в текущем каталоге.

Новый процесс имеет ту же среду, что и текущий процесс.

  • Since 4.08
val open_process_args_in : string -> string array -> in_channel

Аналогично Unix.open_process_args, но перенаправляет только стандартный вывод нового процесса.

  • Since 4.08
val open_process_args_out : string -> string array -> out_channel

Аналогично Unix.open_process_args, но перенаправляет только стандартный ввод нового процесса.

  • Since 4.08
val open_process_args_full : string ->       string array ->       string array -> in_channel * out_channel * in_channel

Аналогично Unix.open_process_args, но третий аргумент задаёт среду, передаваемую новому процессу. Результатом является тройка каналов, подключенных соответственно к стандартному выводу, стандартному вводу и стандартной ошибке программы.

  • Since 4.08
val process_in_pid : in_channel -> int

Возвращает PID процесса, открытого с помощью Unix.open_process_args_in, или PID оболочки, открытой с помощью Unix.open_process_in.

  • Since 4.08 (4.12 в UnixLabels)
val process_out_pid : out_channel -> int

Возвращает PID процесса, открытого с помощью Unix.open_process_args_out, или PID оболочки, открытой с помощью Unix.open_process_out.

  • Since 4.08 (4.12 в UnixLabels)
val process_pid : in_channel * out_channel -> int

Возвращает PID процесса, открытого с помощью Unix.open_process_args, или PID оболочки, открытой с помощью Unix.open_process_args.

  • Since 4.08 (4.12 в UnixLabels)
val process_full_pid : in_channel * out_channel * in_channel -> int

Возвращает PID процесса, открытого с помощью Unix.open_process_args_full, или PID оболочки, открытой с помощью Unix.open_process_full.

  • Since 4.08 (4.12 в UnixLabels)
val close_process_in : in_channel -> process_status

Закрывает каналы, открытые с помощью Unix.open_process_in, ждёт завершения связанной команды и возвращает её код завершения.

val close_process_out : out_channel -> process_status

Закрывает каналы, открытые с помощью Unix.open_process_out, ждёт завершения связанной команды и возвращает её код завершения.

val close_process : in_channel * out_channel -> process_status

Закрывает каналы, открытые с помощью Unix.open_process, ждёт завершения связанной команды и возвращает её код завершения.

val close_process_full : in_channel * out_channel * in_channel ->       process_status

Закрывает каналы, открытые с помощью Unix.open_process_full, ждёт завершения связанной команды и возвращает её код завершения.

Символьные ссылки

val symlink : ?to_dir:bool -> string -> string -> unit

symlink ?to_dir src dst создаёт файл dst как символическую ссылку на файл src. В Windows, ~to_dir указывает, ссылается ли символическая ссылка на каталог или файл; если опущено, symlink проверяет src с помощью stat и выбирает соответствующий вариант, если src не существует, то предполагается false (по этой причине рекомендуется указывать параметр ~to_dir в новом коде). В Unix параметр ~to_dir игнорируется.

Символьные ссылки в Windows доступны начиная с Windows Vista. Существуют некоторые важные различия между символическими ссылками Windows и их POSIX аналогами.

Символьные ссылки Windows бывают двух типов: каталоги и обычные, которые указывают, ссылается ли символическая ссылка на каталог или файл. Тип должен быть правильным — символическая ссылка на каталог, которая фактически ссылается на файл, не может быть выбрана с помощью chdir, а символическая ссылка на файл, которая фактически ссылается на каталог, не может быть прочитана или записана (обратите внимание, что эмуляция Cygwin игнорирует это различие).

Когда символические ссылки создаются на существующие цели, это различие не имеет значения, и symlink автоматически создаст правильный тип символической ссылки. Различие имеет значение, когда символическая ссылка создаётся на несуществующую цель.

Ещё один нюанс заключается в том, что по умолчанию создание символических ссылок — привилегированная операция. Администраторы всегда должны запускаться с повышенными правами (или с отключённым UAC), а по умолчанию обычным пользовательским учётным записям необходимо предоставить привилегию SeCreateSymbolicLinkPrivilege через Политику локальной безопасности (secpol.msc) или через Active Directory.

Unix.has_symlink можно использовать для проверки возможности создания символических ссылок в процессе.

val has_symlink : unit -> bool

Возвращает true , если пользователь может создавать символические ссылки. В Windows это означает, что у пользователя не только есть привилегия SeCreateSymbolicLinkPrivilege, но он также запущен с повышенными правами, если это необходимо. На других платформах это просто указывает на доступность системного вызова symlink.

  • Since 4.03
val readlink : string -> string

Чтение содержимого символической ссылки.

Опрос

val select : file_descr list ->       file_descr list ->       file_descr list ->       float -> file_descr list * file_descr list * file_descr list

Ожидание, пока некоторые операции ввода-вывода станут возможными в некоторых каналах. Три списка аргументов представляют соответственно набор дескрипторов для проверки на чтение (первый аргумент), на запись (второй аргумент) или на исключительные ситуации (третий аргумент). Четвёртый аргумент — максимальное время ожидания в секундах; отрицательный четвёртый аргумент означает отсутствие времени ожидания (неограниченное ожидание). Результатом является три набора дескрипторов: те, которые готовы к чтению (первый компонент), готовы к записи (второй компонент) и по которым ожидается исключительная ситуация (третий компонент).

Блокировка

type lock_command = 
| F_ULOCK (*

Разблокировать область

*)
| F_LOCK (*

Заблокировать область для записи и заблокировать, если она уже заблокирована

*)
| F_TLOCK (*

Заблокировать область для записи или вернуть ошибку, если она уже заблокирована

*)
| F_TEST (*

Проверить область на наличие блокировок других процессов

*)
| F_RLOCK (*

Заблокировать область для чтения и заблокировать, если она уже заблокирована

*)
| F_TRLOCK (*

Заблокировать область для чтения или вернуть ошибку, если она уже заблокирована

*)

Команды для Unix.lockf.

val lockf : file_descr -> lock_command -> int -> unit

lockf fd mode len устанавливает блокировку на области файла, открытого как fd. Область начинается с текущей позиции чтения/записи для fd (как задано Unix.lseek) и расширяется на len байт вперед, если len положительное, на len байт назад, если len отрицательное, или до конца файла, если len равно нулю. Блокировка на запись предотвращает получение блокировки на чтение или запись другим процессом в данной области. Блокировка на чтение предотвращает получение блокировки на запись другим процессом в данной области, но позволяет другим процессам получать блокировки на чтение.

Команды F_LOCK и F_TLOCK пытаются установить блокировку на запись в указанной области. Команды F_RLOCK и F_TRLOCK пытаются установить блокировку на чтение в указанной области. Если одна или несколько блокировок, установленных другим процессом, препятствуют получению блокировки текущим процессом, F_LOCK и F_RLOCK блокируются до тех пор, пока эти блокировки не будут сняты, в то время как F_TLOCK и F_TRLOCK сразу же завершаются с исключением. Команда F_ULOCK удаляет все блокировки, которые имеет текущий процесс в указанной области. Наконец, команда F_TEST проверяет, может ли быть получена блокировка на запись в указанной области, не устанавливая фактически блокировку. Она возвращается немедленно, если успешно, или завершается неудачно в противном случае.

Что происходит, когда процесс пытается заблокировать область файла, которая уже заблокирована тем же процессом, зависит от ОС. В POSIX-совместимых системах вторая операция блокировки завершается успешно и может «повысить» более старую блокировку с блокировки на чтение до блокировки на запись. В Windows вторая операция блокировки будет заблокирована или завершится неудачно.

Сигналы

Примечание: установка обработчиков сигналов выполняется с помощью функций Sys.signal и Sys.set_signal.

val kill : int -> int -> unit

kill pid signal отправляет сигнал с номером signal процессу с id pid.

В Windows: эмулируется только сигнал Sys.sigkill.

type sigprocmask_command = 
| SIG_SETMASK
| SIG_BLOCK
| SIG_UNBLOCK
val sigprocmask : sigprocmask_command -> int list -> int list

sigprocmask mode sigs изменяет набор заблокированных сигналов. Если mode равно SIG_SETMASK, заблокированные сигналы устанавливаются в соответствии со списком sigs. Если mode равно SIG_BLOCK, сигналы в sigs добавляются к набору заблокированных сигналов. Если mode равно SIG_UNBLOCK, сигналы в sigs удаляются из набора заблокированных сигналов. sigprocmask возвращает набор ранее заблокированных сигналов.

При загрузке модуля Thread в версии systhreads эта функция перенаправляется на Thread.sigmask. То есть, sigprocmask изменяет только маску текущей нити.

  • Raises Invalid_argument в Windows (нет межпроцессных сигналов в Windows)
val sigpending : unit -> int list

Возвращает набор заблокированных сигналов, которые в данный момент ожидаются.

  • Raises Invalid_argument в Windows (нет межпроцессных сигналов в Windows)
val sigsuspend : int list -> unit

sigsuspend sigs атомарно устанавливает заблокированные сигналы на sigs и ожидает доставки неотклоненного, незаблокированного сигнала. По возвращении заблокированные сигналы сбрасываются до их начального значения.

  • Raises Invalid_argument в Windows (нет межпроцессных сигналов в Windows)
val pause : unit -> unit

Ожидать, пока не будет доставлен неотклоненный, незаблокированный сигнал.

  • Raises Invalid_argument в Windows (нет межпроцессных сигналов в Windows)

Функции времени

type process_times = {
tms_utime : float; (*

Время пользователя для процесса

*)
tms_stime : float; (*

Время системы для процесса

*)
tms_cutime : float; (*

Время пользователя для дочерних процессов

*)
tms_cstime : float; (*

Время системы для дочерних процессов

*)
}

Времена выполнения (времена процессора) процесса.

type tm = {
tm_sec : int; (*

Секунды 0..60

*)
tm_min : int; (*

Минуты 0..59

*)
tm_hour : int; (*

Часы 0..23

*)
tm_mday : int; (*

День месяца 1..31

*)
tm_mon : int; (*

Месяц года 0..11

*)
tm_year : int; (*

Год - 1900

*)
tm_wday : int; (*

День недели (воскресенье - 0)

*)
tm_yday : int; (*

День года 0..365

*)
tm_isdst : bool; (*

Действует ли летнее время

*)
}

Тип, представляющий время часов и календарную дату.

val time : unit -> float

Возвращает текущее время с 00:00:00 по Гринвичу, 1 января 1970 года, в секундах.

val gettimeofday : unit -> float

То же, что и Unix.time, но с разрешением лучше, чем 1 секунда.

val gmtime : float -> tm

Преобразует время в секундах, возвращаемое Unix.time, в дату и время. Предполагается UTC (Координированное универсальное время), также известное как GMT. Для выполнения обратного преобразования установите переменную среды TZ в "UTC", используйте Unix.mktime, а затем восстановите исходное значение TZ.

val localtime : float -> tm

Преобразует время в секундах, возвращаемое Unix.time, в дату и время. Предполагается местное часовое поясное время. Функция, выполняющая обратное преобразование, — Unix.mktime.

val mktime : tm -> float * tm

Преобразует дату и время, заданные аргументом tm, в время в секундах, возвращаемое Unix.time. Поля tm_isdst, tm_wday и tm_yday записи tm игнорируются. Также возвращает нормализованную копию заданной записи tm, с пересчитанными полями tm_wday, tm_yday и tm_isdst из других полей, а другие поля нормализованы (например, 40 октября изменяется на 9 ноября). Аргумент tm интерпретируется в местном часовом поясе.

val alarm : int -> int

Планирует сигнал SIGALRM через заданное количество секунд.

  • Вызывает Invalid_argument в Windows
val sleep : int -> unit

Останавливает выполнение на заданное количество секунд.

val sleepf : float -> unit

Останавливает выполнение на заданное количество секунд. Как и sleep, но поддерживаются доли секунды.

  • С 4.03 (4.12 в UnixLabels)
val times : unit -> process_times

Возвращает время выполнения процесса.

В Windows: частично реализовано, не будет сообщать о времени выполнения дочерних процессов.

val utimes : string -> float -> float -> unit

Устанавливает время последнего доступа (второй аргумент) и время последней модификации (третий аргумент) для файла. Время выражается в секундах с 00:00:00 по Гринвичу, 1 января 1970 года. Если оба времени 0.0, время доступа и последней модификации устанавливаются на текущее время.

type interval_timer = 
| ITIMER_REAL (*

уменьшается в реальном времени и отправляет сигнал SIGALRM при истечении срока действия.

*)
| ITIMER_VIRTUAL (*

уменьшается в виртуальном времени процесса и отправляет SIGVTALRM при истечении срока действия.

*)
| ITIMER_PROF (*

(для профилирования) уменьшается как при выполнении процесса, так и при выполнении системы от имени процесса; отправляет SIGPROF при истечении срока действия.

*)

Три вида таймеров интервалов.

type interval_timer_status = {
it_interval : float; (*

Период

*)
it_value : float; (*

Текущее значение таймера

*)
}

Тип, описывающий состояние таймера интервалов

val getitimer : interval_timer -> interval_timer_status

Возвращает текущее состояние заданного таймера интервалов.

  • Вызывает Invalid_argument в Windows
val setitimer : interval_timer ->       interval_timer_status -> interval_timer_status

setitimer t s устанавливает таймер интервалов t и возвращает его предыдущее состояние. Аргумент s интерпретируется следующим образом: s.it_value, если не равно нулю, — время до следующего истечения таймера; s.it_interval, если не равно нулю, задаёт значение, используемое при перезагрузке it_value при истечении таймера. Установка s.it_value в ноль отключает таймер. Установка s.it_interval в ноль приводит к отключению таймера после его следующего истечения.

  • Вызывает Invalid_argument в Windows

Идентификатор пользователя, идентификатор группы

val getuid : unit -> int

Возвращает идентификатор пользователя, выполняющего процесс.

В Windows: всегда возвращает 1.

val geteuid : unit -> int

Возвращает эффективный идентификатор пользователя, под которым выполняется процесс.

В Windows: всегда возвращает 1.

val setuid : int -> unit

Установите реальный идентификатор пользователя и эффективный идентификатор пользователя для процесса.

  • Raises Invalid_argument в Windows
val getgid : unit -> int

Возвращает идентификатор группы пользователя, выполняющего процесс.

В Windows: всегда возвращает 1.

val getegid : unit -> int

Возвращает эффективный идентификатор группы, под которым выполняется процесс.

В Windows: всегда возвращает 1.

val setgid : int -> unit

Установите реальный идентификатор группы и эффективный идентификатор группы для процесса.

  • Raises Invalid_argument в Windows
val getgroups : unit -> int array

Возвращает список групп, к которым принадлежит пользователь, выполняющий процесс.

В Windows: всегда возвращает [|1|].

val setgroups : int array -> unit

setgroups groups устанавливает дополнительные идентификаторы групп для вызывающего процесса. Требуются соответствующие привилегии.

  • Raises Invalid_argument в Windows
val initgroups : string -> int -> unit

initgroups user group инициализирует список доступа к группам, считывая базу данных групп /etc/group и используя все группы, членами которых является user . Также в список добавляется дополнительная группа group.

  • Raises Invalid_argument в Windows
type passwd_entry = {
pw_name : string;
pw_passwd : string;
pw_uid : int;
pw_gid : int;
pw_gecos : string;
pw_dir : string;
pw_shell : string;
}

Структура записей в базе данных passwd.

type group_entry = {
gr_name : string;
gr_passwd : string;
gr_gid : int;
gr_mem : string array;
}

Структура записей в базе данных groups.

val getlogin : unit -> string

Возвращает имя пользователя, выполняющего процесс.

val getpwnam : string -> passwd_entry

Находит запись в passwd с заданным именем.

  • Raises Not_found если такая запись не существует, или всегда в Windows.
val getgrnam : string -> group_entry

Находит запись в group с заданным именем.

  • Raises Not_found если такая запись не существует, или всегда в Windows.
val getpwuid : int -> passwd_entry

Находит запись в passwd с заданным идентификатором пользователя.

  • Raises Not_found если такая запись не существует, или всегда в Windows.
val getgrgid : int -> group_entry

Находит запись в group с заданным идентификатором группы.

  • Raises Not_found если такая запись не существует, или всегда в Windows.

Интернет-адреса

type inet_addr 

Абстрактный тип интернет-адресов.

val inet_addr_of_string : string -> inet_addr

Преобразование из текстового представления интернет-адреса в его внутреннее представление. Строка-аргумент состоит из 4 чисел, разделенных точками (XXX.YYY.ZZZ.TTT) для адресов IPv4 и до 8 чисел, разделенных двоеточиями, для адресов IPv6.

  • Raises Failure при передаче строки, которая не соответствует этим форматам.
val string_of_inet_addr : inet_addr -> string

Возвращает текстовое представление данного интернет-адреса. Смотрите Unix.inet_addr_of_string для описания текстового представления.

val inet_addr_any : inet_addr

Специальный IPv4-адрес, используемый только с bind, представляющий все интернет-адреса, которыми обладает хост-машина.

val inet_addr_loopback : inet_addr

Специальный IPv4-адрес, представляющий хост-машину (127.0.0.1).

val inet6_addr_any : inet_addr

Специальный IPv6-адрес, используемый только с bind, представляющий все интернет-адреса, которыми обладает хост-машина.

val inet6_addr_loopback : inet_addr

Является ли данный inet_addr IPv6-адресом.

  • Since 4.12

Сокеты

type socket_domain = 
| PF_UNIX (*

Домен Unix

*)
| PF_INET (*

Домен Интернета (IPv4)

*)
| PF_INET6 (*

Домен Интернета (IPv6)

*)

Тип доменов сокетов. Не все платформы поддерживают IPv6-сокеты (тип PF_INET6).

В Windows: PF_UNIX поддерживается с 4.14.0 в Windows 10 1803 и более поздних версиях.

type socket_type = 
| SOCK_STREAM (*

Сокет потокового типа

*)
| SOCK_DGRAM (*

Сокет типа датаграмм

*)
| SOCK_RAW (*

Сокет типа сырых данных

*)
| SOCK_SEQPACKET (*

Сокет для пакетов с последовательностью

*)

Тип видов сокетов, определяющий семантику связи. SOCK_SEQPACKET включен для полноты, но редко поддерживается ОС и требует системных вызовов, недоступных в этой библиотеке.

type sockaddr = 
| ADDR_UNIX of string
| ADDR_INET of inet_addr * int

Тип адресов сокетов. ADDR_UNIX name — адрес сокета в домене Unix; name — имя файла в файловой системе. ADDR_INET(addr,port) — адрес сокета в домене Интернета; addr — интернет-адрес машины, а port — номер порта.

val socket : ?cloexec:bool ->       socket_domain -> socket_type -> int -> file_descr

Создайте новый сокет в заданном домене и с заданным типом. Третий аргумент — тип протокола; 0 выбирает протокол по умолчанию для данного типа сокетов. Смотрите Unix.set_close_on_exec для документации по cloexec необязательному аргументу.

val domain_of_sockaddr : sockaddr -> socket_domain

Возвращает домен сокета, соответствующий заданному адресу сокета.

val socketpair : ?cloexec:bool ->       socket_domain ->       socket_type -> int -> file_descr * file_descr

Создайте пару безымянных сокетов, соединённых между собой. Смотрите Unix.set_close_on_exec для документации по cloexec необязательному аргументу.

val accept : ?cloexec:bool -> file_descr -> file_descr * sockaddr

Принять подключения на заданном сокете. Возвращаемый дескриптор — сокет, подключенный к клиенту; возвращаемый адрес — адрес подключающегося клиента. Смотрите Unix.set_close_on_exec для документации по cloexec необязательному аргументу.

val bind : file_descr -> sockaddr -> unit

Связать сокет с адресом.

val connect : file_descr -> sockaddr -> unit

Подключить сокет к адресу.

val listen : file_descr -> int -> unit

Настроить сокет для получения запросов на подключение. Целочисленный аргумент — максимальное количество ожидающих запросов.

type shutdown_command = 
| SHUTDOWN_RECEIVE (*

Закрыть для приёма

*)
| SHUTDOWN_SEND (*

Закрыть для отправки

*)
| SHUTDOWN_ALL (*

Закрыть оба

*)

Тип команд для shutdown.

val shutdown : file_descr -> shutdown_command -> unit

Закрыть подключение сокета. SHUTDOWN_SEND в качестве второго аргумента приводит к тому, что чтение на другом конце подключения возвращает состояние конца файла. SHUTDOWN_RECEIVE приводит к тому, что запись на другом конце подключения возвращает состояние закрытой трубы (сигнал SIGPIPE).

val getsockname : file_descr -> sockaddr

Возвращает адрес заданного сокета.

val getpeername : file_descr -> sockaddr

Возвращает адрес хоста, подключенного к заданному сокету.

type msg_flag = 
| MSG_OOB
| MSG_DONTROUTE
| MSG_PEEK

Флаги для Unix.recv, Unix.recvfrom, Unix.send и Unix.sendto.

val recv : file_descr -> bytes -> int -> int -> msg_flag list -> int

Получить данные из подключенного сокета.

val recvfrom : file_descr ->       bytes -> int -> int -> msg_flag list -> int * sockaddr

Получить данные из неподключенного сокета.

val send : file_descr -> bytes -> int -> int -> msg_flag list -> int

Отправить данные по подключенному сокету.

val send_substring : file_descr -> string -> int -> int -> msg_flag list -> int

То же, что и send, но данные берутся из строки вместо последовательности байтов.

  • Since 4.02
val sendto : file_descr ->       bytes -> int -> int -> msg_flag list -> sockaddr -> int

Отправить данные по неподключенному сокету.

val sendto_substring : file_descr ->       string -> int -> int -> msg_flag list -> sockaddr -> int

То же, что и sendto, но данные берутся из строки вместо последовательности байтов.

  • Since 4.02

Параметры сокета

type socket_bool_option = 
| SO_DEBUG (*

Запись отладочной информации

*)
| SO_BROADCAST (*

Разрешить отправку сообщений широковещательной рассылки

*)
| SO_REUSEADDR (*

Разрешить повторное использование локальных адресов для связывания

*)
| SO_KEEPALIVE (*

Поддерживать активное соединение

*)
| SO_DONTROUTE (*

Обойти стандартные алгоритмы маршрутизации

*)
| SO_OOBINLINE (*

Оставить данные вне зоны действия в строке

*)
| SO_ACCEPTCONN (*

Сообщить, включено ли прослушивание сокета

*)
| TCP_NODELAY (*

Управление алгоритмом Nagle для сокетов TCP

*)
| IPV6_ONLY (*

Запретить привязку IPv6-сокета к IPv4-адресу

*)
| SO_REUSEPORT (*

Разрешить повторное использование привязок адреса и порта

*)

Параметры сокета, которые можно получить с помощью Unix.getsockopt и изменить с помощью Unix.setsockopt. Эти параметры имеют булевое (true/false) значение.

type socket_int_option = 
| SO_SNDBUF (*

Размер буфера отправки

*)
| SO_RCVBUF (*

Размер буфера приема

*)
| SO_ERROR (*
Устарело. Используйте Unix.getsockopt_error вместо этого.

Устарело. Используйте Unix.getsockopt_error вместо этого.

*)
| SO_TYPE (*

Отчет о типе сокета

*)
| SO_RCVLOWAT (*

Минимальное количество байтов для обработки операций ввода

*)
| SO_SNDLOWAT (*

Минимальное количество байтов для обработки операций вывода

*)

Параметры сокета, которые можно просмотреть с помощью Unix.getsockopt_int и изменить с помощью Unix.setsockopt_int. Эти параметры имеют целочисленное значение.

type socket_optint_option = 
| SO_LINGER (*

Оставаться ли в ожидании на закрытых соединениях, имеющих присутствующие данные, и на какой длительности (в секундах)

*)

Параметры сокета, которые можно просмотреть с помощью Unix.getsockopt_optint и изменить с помощью Unix.setsockopt_optint. Эти параметры имеют значение типа int option, где None означает «выключено».

type socket_float_option = 
| SO_RCVTIMEO (*

Таймаут для операций ввода

*)
| SO_SNDTIMEO (*

Таймаут для операций вывода

*)

Параметры сокета, которые можно просмотреть с помощью Unix.getsockopt_float и изменить с помощью Unix.setsockopt_float. Эти параметры имеют значение с плавающей точкой, представляющее время в секундах. Значение 0 означает бесконечный таймаут.

val getsockopt : file_descr -> socket_bool_option -> bool

Возвращает текущий статус параметра булевого типа в данном сокете.

val setsockopt : file_descr -> socket_bool_option -> bool -> unit

Устанавливает или сбрасывает параметр булевого типа в данном сокете.

val getsockopt_int : file_descr -> socket_int_option -> int

Аналогично Unix.getsockopt для параметра сокета с целочисленным значением.

val setsockopt_int : file_descr -> socket_int_option -> int -> unit

Аналогично Unix.setsockopt для параметра сокета с целочисленным значением.

val getsockopt_optint : file_descr -> socket_optint_option -> int option

Аналогично Unix.getsockopt для параметра сокета, значение которого является int option.

val setsockopt_optint : file_descr -> socket_optint_option -> int option -> unit

Аналогично Unix.setsockopt для параметра сокета, значение которого является int option.

val getsockopt_float : file_descr -> socket_float_option -> float

Аналогично Unix.getsockopt для параметра сокета, значение которого является числом с плавающей точкой.

val setsockopt_float : file_descr -> socket_float_option -> float -> unit

Аналогично Unix.setsockopt для параметра сокета, значение которого является числом с плавающей точкой.

val getsockopt_error : file_descr -> error option

Возвращает состояние ошибки, связанное с данным сокетом, и очищает его.

Функции высокоуровневого сетевого соединения

val open_connection : sockaddr -> in_channel * out_channel

Подключение к серверу по заданному адресу. Возвращает пару буферизованных каналов, подключенных к серверу. Не забудьте вызвать flush на канале вывода в нужные моменты, чтобы обеспечить правильную синхронизацию.

Два канала, возвращаемые open_connection, используют один дескриптор сокета. Поэтому, когда подключение завершено, вы должны вызвать close_out на канале вывода, что также закроет базовый сокет. Не вызывайте close_in на канале ввода; он будет собран сборщиком мусора в конечном итоге.

val shutdown_connection : in_channel -> unit

«Закрытие» соединения, установленного с помощью Unix.open_connection; то есть, передача состояния конца файла серверу, читающему по другому концу соединения. Это не закрывает сокет и каналы, используемые соединением. См. Unix.open_connection о том, как закрыть их после завершения соединения.

val establish_server : (in_channel -> out_channel -> unit) -> sockaddr -> unit

Установление сервера по заданному адресу. Переданная в качестве первого аргумента функция вызывается для каждого подключения с двумя буферизованными каналами, подключенными к клиенту. Для каждого подключения создается новый процесс. Функция Unix.establish_server никогда не возвращается нормально.

Два канала, предоставленные функции, используют один дескриптор сокета. Функции не нужно закрывать каналы, так как это происходит автоматически при возврате функции. Если функция предпочитает явное закрытие, она должна закрыть канал вывода с помощью close_out и оставить канал ввода незакрытым по причинам, объясненным в Unix.in_channel_of_descr.

  • Возбуждает Invalid_argument в Windows. Используйте потоки вместо этого.

Базы данных хостов и протоколов

type host_entry = {
h_name : string;
h_aliases : string array;
h_addrtype : socket_domain;
h_addr_list : inet_addr array;
}

Структура записей в базе данных hosts.

type protocol_entry = {
p_name : string;
p_aliases : string array;
p_proto : int;
}

Структура записей в базе данных protocols.

type service_entry = {
s_name : string;
s_aliases : string array;
s_port : int;
s_proto : string;
}

Структура записей в базе данных services.

val gethostname : unit -> string

Возвращает имя локального хоста.

val gethostbyname : string -> host_entry

Находит запись в hosts с заданным именем.

  • Возбуждает Not_found если такая запись не существует.
val gethostbyaddr : inet_addr -> host_entry

Находит запись в hosts с заданным адресом.

  • Возбуждает Not_found если такая запись не существует.
val getprotobyname : string -> protocol_entry

Находит запись в protocols с заданным именем.

  • Возбуждает Not_found если такая запись не существует.
val getprotobynumber : int -> protocol_entry

Находит запись в protocols с заданным номером протокола.

  • Возбуждает Not_found если такая запись не существует.
val getservbyname : string -> string -> service_entry

Находит запись в services с заданным именем.

  • Возбуждает Not_found если такая запись не существует.
val getservbyport : int -> string -> service_entry

Находит запись в services с заданным номером сервиса.

  • Возбуждает Not_found если такая запись не существует.
type addr_info = {
ai_family : socket_domain; (*

Домен сокета

*)
ai_socktype : socket_type; (*

Тип сокета

*)
ai_protocol : int; (*

Номер протокола сокета

*)
ai_addr : sockaddr; (*

Адрес

*)
ai_canonname : string; (*

Каноническое имя хоста

*)
}

Информация об адресе, возвращённая Unix.getaddrinfo.

type getaddrinfo_option = 
| AI_FAMILY of socket_domain (*

Установить заданный домен сокета

*)
| AI_SOCKTYPE of socket_type (*

Установить заданный тип сокета

*)
| AI_PROTOCOL of int (*

Установить заданный протокол

*)
| AI_NUMERICHOST (*

Не вызывать разрешение имён, ожидать числовой IP-адрес

*)
| AI_CANONNAME (*

Заполнить поле ai_canonname результата

*)
| AI_PASSIVE (*

Установить адрес на адрес «любой» для использования с Unix.bind

*)

Параметры для Unix.getaddrinfo.

val getaddrinfo : string -> string -> getaddrinfo_option list -> addr_info list

getaddrinfo host service opts возвращает список записей Unix.addr_info, описывающих параметры сокета и адреса, подходящие для связи с заданным хостом и службой. Пустой список возвращается, если имена хоста или службы неизвестны, или ограничения, выраженные в opts, не могут быть удовлетворены.

host — это имя хоста или строковое представление IP-адреса. host может быть задано как пустая строка; в этом случае используется адрес «любой» или «обратный» адрес, в зависимости от того, содержит ли opts AI_PASSIVE. service — это имя службы или строковое представление номера порта. service может быть задано как пустая строка; в этом случае поле порта возвращённых адресов устанавливается в 0. opts — это, возможно, пустой список параметров, который позволяет вызывающей стороне принудительно установить определённый домен сокета (например, только IPv6 или только IPv4) или определённый тип сокета (например, только TCP или только UDP).

type name_info = {
ni_hostname : string; (*

Имя или IP-адрес хоста

*)
ni_service : string; (*

Имя службы или номер порта

*)
}

Информация о хосте и службе, возвращённая Unix.getnameinfo.

type getnameinfo_option = 
| NI_NOFQDN (*

Не квалифицировать имена локальных хостов

*)
| NI_NUMERICHOST (*

Всегда возвращать хост в виде IP-адреса

*)
| NI_NAMEREQD (*

Ошибка, если имя хоста не может быть определено

*)
| NI_NUMERICSERV (*

Всегда возвращать сервис в виде номера порта

*)
| NI_DGRAM (*

Рассматривать сервис как UDP-базированный вместо стандартного TCP

*)

Параметры для Unix.getnameinfo.

val getnameinfo : sockaddr -> getnameinfo_option list -> name_info

getnameinfo addr opts возвращает имя хоста и имя сервиса, соответствующие адресу сокета addr. opts — это, возможно, пустой список параметров, определяющий, как получить эти имена.

  • Raises Not_found если произошла ошибка.

Интерфейс терминала

Следующие функции реализуют стандартный интерфейс терминала POSIX. Они обеспечивают управление асинхронными коммуникационными портами и псевдотерминалами. Обратитесь к странице справки termios для получения полного описания.

type terminal_io = {
mutable c_ignbrk : bool; (*

Игнорировать условие прерывания.

*)
mutable c_brkint : bool; (*

Сигнализировать прерывание при условии разрыва.

*)
mutable c_ignpar : bool; (*

Игнорировать символы с ошибками чётности.

*)
mutable c_parmrk : bool; (*

Помечать ошибки чётности.

*)
mutable c_inpck : bool; (*

Включить проверку чётности на входе.

*)
mutable c_istrip : bool; (*

Удалить 8-й бит в символах на входе.

*)
mutable c_inlcr : bool; (*

Преобразовать NL в CR на входе.

*)
mutable c_igncr : bool; (*

Игнорировать CR на входе.

*)
mutable c_icrnl : bool; (*

Преобразовать CR в NL на входе.

*)
mutable c_ixon : bool; (*

Распознавать символы XON/XOFF на входе.

*)
mutable c_ixoff : bool; (*

Выводить символы XON/XOFF для управления потоком ввода.

*)
mutable c_opost : bool; (*

Включить обработку вывода.

*)
mutable c_obaud : int; (*

Скорость вывода (0 означает закрытие соединения).

*)
mutable c_ibaud : int; (*

Скорость ввода.

*)
mutable c_csize : int; (*

Количество бит на символ (5-8).

*)
mutable c_cstopb : int; (*

Количество стоповых битов (1-2).

*)
mutable c_cread : bool; (*

Приём включен.

*)
mutable c_parenb : bool; (*

Включить генерацию и обнаружение чётности.

*)
mutable c_parodd : bool; (*

Указать нечётную чётность вместо чётной.

*)
mutable c_hupcl : bool; (*

Развесить на последнем закрытии.

*)
mutable c_clocal : bool; (*

Игнорировать линии состояния модема.

*)
mutable c_isig : bool; (*

Генерировать сигнал на INTR, QUIT, SUSP.

*)
mutable c_icanon : bool; (*

Включить каноническую обработку (буферизация строк и редактирование).

*)
mutable c_noflsh : bool; (*

Отключить сброс после INTR, QUIT, SUSP.

*)
mutable c_echo : bool; (*

Эхо-символы ввода.

*)
mutable c_echoe : bool; (*

Эхо ERASE (для стирания предыдущего символа).

*)
mutable c_echok : bool; (*

Эхо KILL (для удаления текущей строки).

*)
mutable c_echonl : bool; (*

Эхо NL, даже если c_echo не установлен.

*)
mutable c_vintr : char; (*

Символ прерывания (обычно Ctrl-C).

*)
mutable c_vquit : char; (*

Символ выхода (обычно Ctrl-\).

*)
mutable c_verase : char; (*

Символ стирания (обычно DEL или Ctrl-H).

*)
mutable c_vkill : char; (*

Символ удаления строки (обычно Ctrl-U).

*)
mutable c_veof : char; (*

Символ конца файла (обычно Ctrl-D).

*)
mutable c_veol : char; (*

Альтернативный символ конца строки (обычно отсутствует).

*)
mutable c_vmin : int; (*

Минимальное количество символов для чтения перед удовлетворением запроса на чтение.

*)
mutable c_vtime : int; (*

Максимальное время ожидания чтения (в единицах 0,1 с).

*)
mutable c_vstart : char; (*

Символ начала (обычно Ctrl-Q).

*)
mutable c_vstop : char; (*

Символ остановки (обычно Ctrl-S).

*)
}
val tcgetattr : file_descr -> terminal_io

Возвращает состояние терминала, соответствующего заданному дескриптору файла.

  • Raises Invalid_argument на Windows
type setattr_when = 
| TCSANOW
| TCSADRAIN
| TCSAFLUSH
val tcsetattr : file_descr -> setattr_when -> terminal_io -> unit

Устанавливает состояние терминала, соответствующего заданному дескриптору файла. Второй аргумент указывает, когда происходит изменение состояния: немедленно (TCSANOW), когда все ожидающие выходные данные были переданы (TCSADRAIN), или после сброса всех полученных, но не прочитанных входных данных (TCSAFLUSH). Рекомендуется использовать TCSADRAIN, изменяя выходные параметры; TCSAFLUSH, изменяя входные параметры.

  • Raises Invalid_argument на Windows
val tcsendbreak : file_descr -> int -> unit

Отправляет условие прерывания на заданный дескриптор файла. Второй аргумент — продолжительность прерывания в единицах 0,1 с; 0 означает стандартную продолжительность (0,25 с).

  • Raises Invalid_argument на Windows
val tcdrain : file_descr -> unit

Ожидает, пока все выходные данные, записанные в заданный дескриптор файла, будут переданы.

  • Raises Invalid_argument на Windows
type flush_queue = 
| TCIFLUSH
| TCOFLUSH
| TCIOFLUSH
val tcflush : file_descr -> flush_queue -> unit

Отбрасывает данные, записанные в заданный дескриптор файла, но еще не переданные, или данные, полученные, но еще не прочитанные, в зависимости от второго аргумента: TCIFLUSH сбрасывает полученные, но не прочитанные данные, TCOFLUSH сбрасывает данные, записанные, но не переданные, и TCIOFLUSH сбрасывает оба типа.

  • Raises Invalid_argument на Windows
type flow_action = 
| TCOOFF
| TCOON
| TCIOFF
| TCION
val tcflow : file_descr -> flow_action -> unit

Приостанавливает или возобновляет прием или передачу данных по заданному дескриптору файла, в зависимости от второго аргумента: TCOOFF приостанавливает вывод, TCOON возобновляет вывод, TCIOFF отправляет символ STOP для приостановки ввода, и TCION отправляет символ START для возобновления ввода.

  • Raises Invalid_argument на Windows
val setsid : unit -> int

Переводит вызывающий процесс в новую сессию и отсоединяет его от управляющего терминала.

  • Raises Invalid_argument на Windows

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Unix.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API