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 (*

Слишком много ссылок: невозможно выполнить splice

*)
| 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

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

val unsafe_environment : unit -> string array

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

  • Начиная с версии 4.06 (4.12 в UnixLabels)
val getenv : string -> string

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

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

Возвращает значение переменной окружения процесса.

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

  • Начиная с версии 4.06
  • Вызывает Not_found, если переменная не задана.
val putenv : string -> string -> unit

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

val unsetenv : string -> unit

unsetenv name удаляет переменную name из окружения процесса.

  • Начиная с версии 5.5

Управление процессами

type process_status = 
| WEXITED of int (*

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

*)
| WSIGNALED of Sys.signal (*

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

*)
| WSTOPPED of Sys.signal (*

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

*)

Статус завершения процесса. Определения стандартных номеров сигналов см. в Sys.signal.

В Windows: используется только WEXITED (так как межпроцессные сигналы отсутствуют), но с особыми кодами возврата, указывающими на специальные причины завершения. Чтобы расшифровать такие коды возврата ошибок, ищите в документации Windows значения NTSTATUS. В частности, код ошибки 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_*.

  • Вызывает 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, дочерний процесс может оказаться в повреждённом состоянии.

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

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

  • Вызывает 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, когда в дочернем процессе происходит фатальная ошибка и он должен завершиться. В этом случае предпочтительно не выполнять в дочернем процессе никаких завершающих действий, поскольку они могут помешать аналогичным действиям родительского процесса. Например, дочерний процесс не должен сбрасывать каналы вывода: родительский процесс может сбросить их повторно, что приведёт к дублированию вывода.

  • Начиная с версии 4.12
val getpid : unit -> int

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

val getppid : unit -> int

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

  • Вызывает Invalid_argument в Windows (так как это не имеет смысла)
val nice : int -> int

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

  • Вызывает 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 (*

Если файл существует, усечь его до нулевой длины

*)
| O_EXCL (*

Выдать ошибку, если файл существует

*)
| O_NOCTTY (*

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

*)
| O_DSYNC (*

Запись завершается после «синхронизированного ввода-вывода с обеспечением целостности данных»

*)
| O_SYNC (*

Запись завершается после «синхронизированного ввода-вывода с обеспечением целостности файла»

*)
| O_RSYNC (*

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

*)
| O_SHARE_DELETE (*

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

*)
| O_CLOEXEC (*

Установить для дескриптора, возвращённого функцией Unix.openfile, флаг close-on-exec. Подробнее см. 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

Сбрасывает буферы файла на диск.

  • Начиная с версии 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.

  • Начиная с версии 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.

  • Начиная с версии 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, но данные берутся из строки, а не из последовательности байтов.

  • Начиная с версии 4.02
val single_write_substring : file_descr -> string -> int -> int -> int

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

  • Начиная с версии 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.

  • Начиная с версии 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; (*

Номер inode

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

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

В случае ошибки проверки аргументов может возникнуть исключение Invalid_argument или Failure.

  • Начиная с версии 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.

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

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

  • Начиная с версии 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

Изменяет права доступа к открытому файлу.

  • Вызывает исключение Invalid_argument в Windows
val chown : string -> int -> int -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val fchown : file_descr -> int -> int -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val umask : file_perm -> file_perm

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

  • Вызывает исключение Invalid_argument в Windows
val access : string -> access_permission list -> unit

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

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

  • Вызывает исключение Unix_error в противном случае.

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

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

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

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

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

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

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

Передача внешней программе файловых дескрипторов, открытых, например, для закрытого файла, часто создаёт уязвимость безопасности: программа получает доступ к закрытому файлу и может использовать его во вред. Поэтому настоятельно рекомендуется устанавливать флаг ``close-on-exec'' для всех файловых дескрипторов, за исключением редких случаев, когда дескриптор действительно необходимо передать другой программе.

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

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

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

val clear_close_on_exec : file_descr -> unit

Сбрасывает флаг ``close-on-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

Изменяет корневой каталог процесса.

  • Вызывает исключение Invalid_argument в Windows
type dir_handle 

Тип дескрипторов открытых каталогов.

val opendir : string -> dir_handle

Открывает дескриптор каталога

val readdir : dir_handle -> string

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

  • Вызывает исключение End_of_file при достижении конца каталога.
val rewinddir : dir_handle -> unit

Перемещает дескриптор в начало каталога

val closedir : dir_handle -> unit

Закрывает дескриптор каталога.

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

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

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

val mkfifo : string -> file_perm -> unit

Создаёт именованный канал с указанными правами доступа (см. Unix.umask).

  • Вызывает исключение 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). Идентификатор процесса (pid) нового процесса возвращается сразу; новый процесс выполняется параллельно с текущим. Стандартные ввод и вывод нового процесса подключаются к дескрипторам 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_in можно использовать Unix.open_process_args_in.

val open_process_out : string -> out_channel

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

val open_process : string -> in_channel * out_channel

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

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

Аналогично Unix.open_process, но второй аргумент задаёт среду, передаваемую команде. Результатом является кортеж из трёх каналов, подключённых соответственно к стандартному выводу, стандартному вводу и стандартному потоку ошибок команды. Если команду не требуется запускать через оболочку, вместо Unix.open_process_full можно использовать Unix.open_process_args_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 ищется в путях поиска. Это поведение изменилось в версии 4.12; ранее prog искался только в текущем каталоге.

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

  • Начиная с версии 4.08
val open_process_args_in : string -> string array -> in_channel

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

  • Начиная с версии 4.08
val open_process_args_out : string -> string array -> out_channel

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

  • Начиная с версии 4.08
val open_process_args_full : string ->       string array ->       string array -> in_channel * out_channel * in_channel

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

  • Начиная с версии 4.08
val process_in_pid : in_channel -> int

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

  • С версии 4.08 (4.12 в UnixLabels)
val process_out_pid : out_channel -> int

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

  • С версии 4.08 (4.12 в UnixLabels)
val process_pid : in_channel * out_channel -> int

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

  • С версии 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.

  • С версии 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, но и, если необходимо, запускает процесс с повышенными правами. На других платформах это просто указывает на доступность системного вызова создания символической ссылки.

  • С версии 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

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

В Windows, если один из списков дескрипторов содержит больше FD_SETSIZE элементов (по умолчанию 64) или используется хотя бы один файловый дескриптор, не являющийся сокетом, максимальное время ожидания ограничивается 232 миллисекундами.

Блокировки

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 -> Sys.signal -> unit

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

В Windows эмулируется только сигнал Sys.sigkill, в результате чего принимающий процесс завершается с кодом ERROR_PROCESS_ABORTED (1067). До OCaml 5.5 принимающий процесс завершался с кодом 0.

type sigprocmask_command = 
| SIG_SETMASK
| SIG_BLOCK
| SIG_UNBLOCK
val sigprocmask : sigprocmask_command -> Sys.signal list -> Sys.signal list

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

У каждого домена и каждого потока, если загружен модуль Thread, есть собственная маска сигналов. sigprocmask изменяет только маску текущего домена или потока.

  • Вызывает исключение Invalid_argument в Windows (в Windows нет межпроцессных сигналов)
val sigpending : unit -> Sys.signal list

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

  • Вызывает исключение Invalid_argument в Windows (в Windows нет межпроцессных сигналов)
val sigsuspend : Sys.signal list -> unit

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

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

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

  • Вызывает исключение Invalid_argument в Windows (в Windows нет межпроцессных сигналов)
val sigwait : Sys.signal list -> Sys.signal

sigwait sigs ожидает, пока один из сигналов в списке sigs не станет ожидающим обработки. Затем функция удаляет этот сигнал из набора ожидающих сигналов и возвращает его номер. Обработчики сигналов, назначенные сигналам из sigs, вызваны не будут. Предполагается, что сигналы sigs заблокированы до вызова sigwait.

  • С версии 5.4
  • Вызывает исключение 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 GMT 1 января 1970 года.

val gettimeofday : unit -> float

То же, что Unix.time, но с точностью лучше одной секунды.

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 GMT 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

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

  • Вызывает исключение Invalid_argument в Windows
val getgid : unit -> int

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

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

val getegid : unit -> int

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

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

val setgid : int -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val getgroups : unit -> int array

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

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

val setgroups : int array -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val initgroups : string -> int -> unit

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

  • Вызывает исключение 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 с указанным именем.

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

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

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

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

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

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

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

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

type inet_addr 

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

val inet_addr_of_string : string -> inet_addr

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

  • Вызывает исключение 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

Специальный адрес IPv6, обозначающий хост-компьютер (::1).

val is_inet6_addr : inet_addr -> bool

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

  • Начиная с версии 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 выбирает протокол по умолчанию для сокетов этого типа. Описание необязательного аргумента cloexec см. в Unix.set_close_on_exec.

val domain_of_sockaddr : sockaddr -> socket_domain

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

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

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

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

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

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, но получает данные из строки, а не из последовательности байтов.

  • Начиная с версии 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, но получает данные из строки, а не из последовательности байтов.

  • Начиная с версии 4.02

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

type socket_bool_option = 
| SO_DEBUG (*

Записывать отладочную информацию

*)
| SO_BROADCAST (*

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

*)
| SO_REUSEADDR (*

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

*)
| SO_KEEPALIVE (*

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

*)
| SO_DONTROUTE (*

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

*)
| SO_OOBINLINE (*

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

*)
| SO_ACCEPTCONN (*

Сообщать, включён ли режим ожидания соединений на сокете

*)
| TCP_NODELAY (*

Управлять алгоритмом Нейгла для сокетов TCP

*)
| IPV6_ONLY (*

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

*)
| SO_REUSEPORT (*

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

  • Начиная с версии 4.12.
*)

Параметры сокета, значения которых можно получить с помощью 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 можно задать пустой строкой; в этом случае используется адрес «любой» или адрес «loopback» в зависимости от того, содержит ли 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 — это, возможно, пустой список параметров, определяющих способ получения этих имён.

  • Вызывает исключение 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; (*

Удалять восьмой бит входных символов.

*)
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

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

  • Вызывает исключение Invalid_argument в Windows
type setattr_when = 
| TCSANOW
| TCSADRAIN
| TCSAFLUSH
val tcsetattr : file_descr -> setattr_when -> terminal_io -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val tcsendbreak : file_descr -> int -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val tcdrain : file_descr -> unit

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

  • Вызывает исключение Invalid_argument в Windows
type flush_queue = 
| TCIFLUSH
| TCOFLUSH
| TCIOFLUSH
val tcflush : file_descr -> flush_queue -> unit

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

  • Вызывает исключение Invalid_argument в Windows
type flow_action = 
| TCOOFF
| TCOON
| TCIOFF
| TCION
val tcflow : file_descr -> flow_action -> unit

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

  • Вызывает исключение Invalid_argument в Windows
val setsid : unit -> int

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

  • Вызывает исключение Invalid_argument в Windows

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/Unix.html

Spec-Zone.ru

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