Модуль UnixLabels
module UnixLabels: sig .. end
Интерфейс к системе Unix.
Чтобы использовать версию этого модуля с метками, добавьте module Unix = UnixLabels в свою реализацию.
Примечание: все функции этого модуля (кроме UnixLabels.error_message и UnixLabels.handle_unix_error) могут вызывать исключение UnixLabels.Unix_error, если базовый системный вызов сигнализирует об ошибке.
Отчет об ошибках
type error = Unix.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
| (* |
Неизвестная ошибка |
*) |
Тип кодов ошибок. Ошибки, определённые стандартом 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 и возвращает результат. Если возникает исключение UnixLabels.Unix_error, выводится сообщение с описанием ошибки и программа завершается с кодом 2.
Доступ к окружению процесса
val environment : unit -> string array
Возвращает окружение процесса в виде массива строк формата ``переменная=значение''. Возвращённый массив пуст, если процесс обладает особыми привилегиями.
val unsafe_environment : unit -> string array
Возвращает окружение процесса в виде массива строк формата ``переменная=значение''. В отличие от UnixLabels.environment, эта функция возвращает непустой массив, даже если процесс обладает особыми привилегиями. Дополнительные сведения см. в документации к UnixLabels.unsafe_getenv.
- Начиная с версии 4.12
val getenv : string -> string
Возвращает значение, связанное с переменной в окружении процесса, если процесс не обладает особыми привилегиями.
-
Вызывает
Not_found, если переменная не задана или процесс обладает особыми привилегиями. Эта функция идентичнаSys.getenv.
val unsafe_getenv : string -> string
Возвращает значение, связанное с переменной в окружении процесса.
В отличие от UnixLabels.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 = Unix.process_status =
|
| WEXITED of
| (* |
Процесс завершился нормально с помощью |
*) |
|
| WSIGNALED of
| (* |
Процесс был завершён сигналом; аргумент — номер сигнала. |
*) |
|
| WSTOPPED of
| (* |
Процесс был остановлен сигналом; аргумент — номер сигнала. |
*) |
Статус завершения процесса. Определения стандартных номеров сигналов см. в Sys.signal.
В Windows используется только WEXITED (поскольку межпроцессных сигналов нет), но с особыми кодами возврата для обозначения причин завершения. Для расшифровки таких кодов ошибок найдите в документации Windows значения NTSTATUS. В частности, код ошибки STATUS_ACCESS_VIOLATION — это 32-разрядный 0xC0000005: поскольку Int32.of_int 0xC0000005 — это -1073741819, WEXITED -1073741819 является эквивалентом Windows для WSIGNALED Sys.sigsegv.
type wait_flag = Unix.wait_flag =
|
| WNOHANG
| (* |
Не блокировать выполнение, если ни один дочерний процесс ещё не завершился, а немедленно вернуть значение pid, равное 0. |
*) |
|
| WUNTRACED
| (* |
Также сообщать о дочерних процессах, получивших сигналы остановки. |
*) |
Флаги для UnixLabels.waitpid.
val execv : prog:string -> args:string array -> 'a
execv prog args выполняют программу из файла prog с аргументами args и текущим окружением процесса. Обратите внимание: по соглашению первый аргумент, args.(0), — это имя файла выполняемой программы, как и Sys.argv.(0). Эти функции execv* никогда не возвращают управление: при успешном выполнении текущая программа заменяется новой.
В Windows: CRT просто запускает новый процесс и завершает текущий. Это может привести к нежелательным последствиям, например если другой процесс ожидает завершения текущего. Рекомендуется вместо этого использовать UnixLabels.create_process или одну из функций open_process_*.
-
Вызывает
Unix_errorпри ошибке
val execve : prog:string -> args:string array -> env:string array -> 'a
То же, что и UnixLabels.execv, за исключением того, что третий аргумент задаёт окружение выполняемой программы.
val execvp : prog:string -> args:string array -> 'a
То же, что и UnixLabels.execv, за исключением того, что программа ищется по путям поиска.
val execvpe : prog:string -> args:string array -> env:string array -> 'a
То же, что и UnixLabels.execve, за исключением того, что программа ищется по путям поиска.
val fork : unit -> int
Создаёт новый процесс. Возвращаемое целое число равно 0 для дочернего процесса и pid дочернего процесса для родительского процесса. Операция завершается ошибкой, если процесс OCaml работает в многопроцессорном режиме (был запущен какой-либо домен). Кроме того, если был запущен какой-либо поток из модуля Thread, дочерний процесс может оказаться в повреждённом состоянии.
-
Вызывает
-
Invalid_argumentв Windows. Вместо этого используйтеUnixLabels.create_processили потоки. -
Failure, если был запущен какой-либо домен.
-
val wait : unit -> int * process_status
Ожидает завершения одного из дочерних процессов и возвращает его pid и статус завершения.
-
Вызывает
Invalid_argumentв Windows. Вместо этого используйтеUnixLabels.waitpid.
val waitpid : mode:wait_flag list -> int -> int * process_status
То же, что и UnixLabels.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 = Unix.file_descr
Абстрактный тип файловых дескрипторов.
val stdin : file_descr
Файловый дескриптор стандартного ввода.
val stdout : file_descr
Файловый дескриптор стандартного вывода.
val stderr : file_descr
Файловый дескриптор стандартного потока ошибок.
type open_flag = Unix.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
| (* |
Установить флаг close-on-exec для дескриптора, возвращённого |
*) |
|
| O_KEEPEXEC
| (* |
Снять флаг close-on-exec. В настоящее время это значение используется по умолчанию. |
*) |
Флаги для UnixLabels.openfile.
type file_perm = int
Тип прав доступа к файлу; например, 0o640 означает чтение и запись для пользователя, чтение для группы и отсутствие прав для остальных
val openfile : string -> mode:open_flag list -> perm:file_perm -> file_descr
Открывает файл с указанным именем и заданными флагами. Третий аргумент задаёт права доступа для файла, если он будет создан (см. UnixLabels.umask). Возвращает файловый дескриптор указанного файла.
val close : file_descr -> unit
Закрывает файловый дескриптор.
val fsync : file_descr -> unit
Сбрасывает буферы файла на диск.
- Начиная с версии 4.12
val read : file_descr -> buf:bytes -> pos:int -> len:int -> int
read fd ~buf ~pos ~len считывает len байт из дескриптора fd и сохраняет их в последовательности байтов buf, начиная с позиции pos в buf. Возвращает фактическое количество прочитанных байтов.
val read_bigarray : file_descr -> buf:('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> pos:int -> len:int -> int
То же, что и UnixLabels.read, но данные считываются в bigarray.
- Начиная с версии 5.2
val write : file_descr -> buf:bytes -> pos:int -> len:int -> int
write fd ~buf ~pos ~len записывает len байт в дескриптор fd, беря их из последовательности байтов buf, начиная с позиции pos в buff. Возвращает фактическое количество записанных байтов. write повторяет операцию записи, пока не будут записаны все байты или не произойдёт ошибка.
val write_bigarray : file_descr -> buf:('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> pos:int -> len:int -> int
То же, что и UnixLabels.write, но данные берутся из bigarray.
- Начиная с версии 5.2
val single_write : file_descr -> buf:bytes -> pos:int -> len:int -> int
То же, что и UnixLabels.write, но выполняет только одну попытку записи. Поэтому, если произойдёт ошибка, single_write гарантирует, что данные не были записаны.
val write_substring : file_descr -> buf:string -> pos:int -> len:int -> int
То же, что и UnixLabels.write, но данные берутся из строки, а не из последовательности байтов.
- Начиная с версии 4.02
val single_write_substring : file_descr -> buf:string -> pos:int -> len:int -> int
То же, что и UnixLabels.single_write, но данные берутся из строки, а не из последовательности байтов.
- Начиная с версии 4.02
val single_write_bigarray : file_descr -> buf:('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> pos:int -> len:int -> int
То же, что и UnixLabels.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 = Unix.seek_command =
|
| SEEK_SET
| (* |
обозначает позиции относительно начала файла |
*) |
|
| SEEK_CUR
| (* |
обозначает позиции относительно текущей позиции |
*) |
|
| SEEK_END
| (* |
обозначает позиции относительно конца файла |
*) |
Режимы позиционирования для UnixLabels.lseek.
val lseek : file_descr -> int -> mode:seek_command -> int
Устанавливает текущую позицию файлового дескриптора и возвращает полученное смещение (от начала файла).
val truncate : string -> len:int -> unit
Усекает файл с указанным именем до заданного размера.
val ftruncate : file_descr -> len:int -> unit
Усекает файл, соответствующий указанному дескриптору, до заданного размера.
Состояние файла
type file_kind = Unix.file_kind =
|
| S_REG
| (* |
Обычный файл |
*) |
|
| S_DIR
| (* |
Каталог |
*) |
|
| S_CHR
| (* |
Символьное устройство |
*) |
|
| S_BLK
| (* |
Блочное устройство |
*) |
|
| S_LNK
| (* |
Символическая ссылка |
*) |
|
| S_FIFO
| (* |
Именованный канал |
*) |
|
| S_SOCK
| (* |
Сокет |
*) |
type stats = Unix.stats = {
st_dev :
| (* |
Номер устройства |
*) | |
st_ino :
| (* |
Номер inode |
*) | |
st_kind :
| (* |
Тип файла |
*) | |
st_perm :
| (* |
Права доступа |
*) | |
st_nlink :
| (* |
Количество ссылок |
*) | |
st_uid :
| (* |
Идентификатор пользователя-владельца |
*) | |
st_gid :
| (* |
Идентификатор группы файла |
*) | |
st_rdev :
| (* |
Идентификатор устройства (для специального файла) |
*) | |
st_size :
| (* |
Размер в байтах |
*) | |
st_atime :
| (* |
Время последнего доступа |
*) | |
st_mtime :
| (* |
Время последнего изменения |
*) | |
st_ctime :
| (* |
Время последнего изменения состояния |
*) |
} Информация, возвращаемая вызовами UnixLabels.stat.
val stat : string -> stats
Возвращает информацию об указанном файле.
val lstat : string -> stats
То же, что и UnixLabels.stat, но если файл является символической ссылкой, возвращает информацию о самой ссылке.
val fstat : file_descr -> stats
Возвращает информацию о файле, связанном с указанным дескриптором.
val isatty : file_descr -> bool
Возвращает true, если указанный файловый дескриптор относится к терминалу или консольному окну, и false в противном случае.
Операции с большими файлами
module LargeFile: sig .. end
Операции с большими файлами.
Отображение файлов в память
val map_file : file_descr -> ?pos:int64 -> kind:('a, 'b) Bigarray.kind -> layout:'c Bigarray.layout -> shared:bool -> dims:int array -> ('a, 'b, 'c) Bigarray.Genarray.t
Отображение файла в память в виде Bigarray. map_file fd ~kind ~layout ~shared ~dims возвращает Bigarray типа kind, с расположением layout и размерностями, заданными в dims. Данные, содержащиеся в этом Bigarray, представляют собой содержимое файла, на который ссылается файловый дескриптор fd (например, предварительно открытый с помощью UnixLabels.openfile). Необязательный параметр pos задает смещение в байтах в файле для отображаемых данных; по умолчанию оно равно 0 (отображение с начала файла).
Если shared имеет значение true, все изменения массива отражаются в файле. Для этого fd должен быть открыт с правами на запись. Если shared имеет значение false, изменения массива выполняются только в памяти с использованием копирования при записи измененных страниц; исходный файл не изменяется.
UnixLabels.map_file гораздо эффективнее, чем чтение всего файла в Bigarray, изменение этого Bigarray и последующая запись.
Чтобы автоматически подстроить размерности Bigarray под фактический размер файла, старшую размерность (то есть первую размерность для массива с расположением C и последнюю — для массива с расположением Fortran) можно задать как -1. В этом случае UnixLabels.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 : src:string -> dst:string -> unit
rename ~src ~dst меняет имя файла с src на dst, при необходимости перемещая его между каталогами. Если dst уже существует, его содержимое заменяется содержимым src. В зависимости от операционной системы метаданные dst (права доступа, владелец и т. д.) могут сохраниться или быть заменены метаданными src.
val link : ?follow:bool -> src:string -> dst: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 = Unix.access_permission =
|
| R_OK
| (* |
Право на чтение |
*) |
|
| W_OK
| (* |
Право на запись |
*) |
|
| X_OK
| (* |
Право на выполнение |
*) |
|
| F_OK
| (* |
Файл существует |
*) |
Флаги для вызова UnixLabels.access.
val chmod : string -> perm:file_perm -> unit
Изменяет права доступа к указанному файлу.
val fchmod : file_descr -> perm:file_perm -> unit
Изменяет права доступа к открытому файлу.
-
Вызывает исключение
Invalid_argumentв Windows
val chown : string -> uid:int -> gid:int -> unit
Изменяет uid и gid владельца указанного файла.
-
Вызывает исключение
Invalid_argumentв Windows
val fchown : file_descr -> uid:int -> gid:int -> unit
Изменяет uid и gid владельца открытого файла.
-
Вызывает исключение
Invalid_argumentв Windows
val umask : file_perm -> file_perm
Задает маску создания файлов для процесса и возвращает предыдущее значение маски.
-
Вызывает исключение
Invalid_argumentв Windows
val access : string -> perm:access_permission list -> unit
Проверяет, имеет ли процесс указанные права доступа к указанному файлу.
В Windows право на выполнение X_OK проверить нельзя; вместо этого проверяется право на чтение.
-
Вызывает исключение
Unix_errorв противном случае.
Операции с файловыми дескрипторами
val dup : ?cloexec:bool -> file_descr -> file_descr
Возвращает новый файловый дескриптор, ссылающийся на тот же файл, что и указанный дескриптор. Описание необязательного аргумента cloexec см. в документации к UnixLabels.set_close_on_exec.
val dup2 : ?cloexec:bool -> src:file_descr -> dst:file_descr -> unit
dup2 ~src ~dst дублирует src в dst, закрывая dst, если он уже открыт. Описание необязательного аргумента cloexec см. в документации к UnixLabels.set_close_on_exec.
val set_nonblock : file_descr -> unit
Устанавливает для указанного дескриптора флаг «неблокирующего режима». Если этот флаг установлен, чтение из дескриптора, для которого временно нет доступных данных, вызывает ошибку EAGAIN или EWOULDBLOCK вместо блокировки; запись в дескриптор, в котором временно нет места для записи, также вызывает EAGAIN или EWOULDBLOCK.
val clear_nonblock : file_descr -> unit
Сбрасывает для указанного дескриптора флаг «неблокирующего режима». См. UnixLabels.set_nonblock.
val set_close_on_exec : file_descr -> unit
Устанавливает для указанного дескриптора флаг «закрыть при выполнении». Дескриптор с этим флагом автоматически закрывается, когда текущий процесс запускает другую программу с помощью одной из функций exec, create_process и open_process.
Утечка файловых дескрипторов, открытых, например, для закрытого файла, во внешнюю программу часто представляет собой уязвимость: программа получает доступ к закрытому файлу и может использовать его во вред. Поэтому настоятельно рекомендуется устанавливать флаг «закрыть при выполнении» для всех файловых дескрипторов, за исключением редких случаев, когда дескриптор необходимо передать другой программе.
Лучший способ установить для файлового дескриптора флаг «закрыть при выполнении» — создать его уже в этом состоянии. Для этого функция openfile предоставляет флаги O_CLOEXEC и O_KEEPEXEC, которые соответственно включают режим «закрыть при выполнении» и режим «сохранить при выполнении». Все остальные операции модуля Unix, создающие файловые дескрипторы, принимают необязательный аргумент ?cloexec:bool, указывающий, следует ли создать дескриптор в режиме «закрыть при выполнении» (если указать ~cloexec:true) или в режиме «сохранить при выполнении» (если указать ~cloexec:false). По историческим причинам, если необязательный аргумент cloexec не указан, дескрипторы по умолчанию создаются в режиме «сохранить при выполнении». Это небезопасное значение по умолчанию, поэтому настоятельно рекомендуется явно передавать аргумент cloexec операциям, создающим файловые дескрипторы.
Необязательные аргументы cloexec и флаг O_KEEPEXEC появились в OCaml 4.05. Ранее обычно файловые дескрипторы создавались в режиме по умолчанию «сохранить при выполнении», а затем для только что созданных дескрипторов вызывалась функция set_close_on_exec. Это менее безопасно, чем создание дескриптора в режиме «закрыть при выполнении», поскольку в многопоточных программах существует окно уязвимости между созданием дескриптора и завершением set_close_on_exec. Если в это время другая нить запустит другую программу, дескриптор утечет, поскольку он все еще находится в режиме «сохранить при выполнении».
Что касается гарантий атомарности, обеспечиваемых ~cloexec:true или использованием флага O_CLOEXEC: на всех платформах гарантируется, что одновременно выполняющаяся нить Caml не сможет передать дескриптор, запустив новый процесс. В Linux эта гарантия распространяется и на одновременно выполняющиеся нити C. По состоянию на февраль 2017 года в других операционных системах отсутствуют необходимые системные вызовы, поэтому сохраняется окно уязвимости, в течение которого нить C может увидеть только что созданный файловый дескриптор в режиме «сохранить при выполнении».
val clear_close_on_exec : file_descr -> unit
Сбрасывает для указанного дескриптора флаг «закрыть при выполнении». См. UnixLabels.set_close_on_exec.
Каталоги
val mkdir : string -> perm:file_perm -> unit
Создает каталог с указанными правами доступа (см. UnixLabels.umask).
val rmdir : string -> unit
Удаляет пустой каталог.
val chdir : string -> unit
Изменяет рабочий каталог процесса.
val getcwd : unit -> string
Возвращает имя текущего рабочего каталога.
val chroot : string -> unit
Изменяет корневой каталог процесса.
-
Вызывает исключение
Invalid_argumentв Windows
type dir_handle = Unix.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 см. в документации к UnixLabels.set_close_on_exec.
val mkfifo : string -> perm:file_perm -> unit
Создает именованный канал с указанными правами доступа (см. UnixLabels.umask).
-
Вызывает исключение
Invalid_argumentв Windows
Высокоуровневое управление процессами и перенаправлениями
val create_process : prog:string -> args:string array -> stdin:file_descr -> stdout:file_descr -> stderr: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 : prog:string -> args:string array -> env:string array -> stdin:file_descr -> stdout:file_descr -> stderr:file_descr -> int
create_process_env ~prog ~args ~env ~stdin ~stdout ~stderr работает так же, как UnixLabels.create_process, за исключением того, что дополнительный аргумент env задает среду, передаваемую программе.
val open_process_in : string -> in_channel
Высокоуровневое управление каналами и процессами. Эта функция запускает указанную команду параллельно с программой. Стандартный вывод команды перенаправляется в канал, данные из которого можно читать через возвращаемый входной канал. Команда интерпретируется оболочкой /bin/sh (или cmd.exe в Windows); см. UnixLabels.system. Функцию Filename.quote_command можно использовать для экранирования команды и ее аргументов в соответствии с используемой оболочкой. Если запускать команду через оболочку не требуется, в качестве более надежной и эффективной альтернативы UnixLabels.open_process_in можно использовать UnixLabels.open_process_args_in.
val open_process_out : string -> out_channel
То же, что и UnixLabels.open_process_in, но стандартный ввод команды перенаправляется в канал. Данные, записанные в возвращаемый выходной канал, передаются стандартному вводу команды. Предупреждение: запись в выходные каналы буферизуется, поэтому для корректной синхронизации своевременно вызывайте flush. Если запускать команду через оболочку не требуется, вместо UnixLabels.open_process_out можно использовать UnixLabels.open_process_args_out.
val open_process : string -> in_channel * out_channel
То же, что и UnixLabels.open_process_out, но стандартные ввод и вывод команды перенаправляются в каналы, подключенные к двум возвращаемым каналам. Входной канал подключен к выводу команды, а выходной — к вводу команды. Если запускать команду через оболочку не требуется, вместо UnixLabels.open_process можно использовать UnixLabels.open_process_args.
val open_process_full : string -> env:string array -> in_channel * out_channel * in_channel
Аналогично UnixLabels.open_process, но второй аргумент задает среду, передаваемую команде. Результатом является тройка каналов, подключенных соответственно к стандартному выводу, стандартному вводу и стандартному потоку ошибок команды. Если запускать команду через оболочку не требуется, вместо UnixLabels.open_process_full можно использовать UnixLabels.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
То же, что и UnixLabels.open_process_args, но перенаправляется только стандартный вывод нового процесса.
- Начиная с версии 4.08
val open_process_args_out : string -> string array -> out_channel
То же, что и UnixLabels.open_process_args, но перенаправляется только стандартный ввод нового процесса.
- Начиная с версии 4.08
val open_process_args_full : string -> string array -> string array -> in_channel * out_channel * in_channel
Аналогично UnixLabels.open_process_args, но третий аргумент задаёт окружение, передаваемое новому процессу. Результат — тройка каналов, соединённых соответственно со стандартным выводом, стандартным вводом и стандартным потоком ошибок программы.
- Начиная с версии 4.08
val process_in_pid : in_channel -> int
Возвращает PID процесса, открытого с помощью UnixLabels.open_process_args_in, или PID оболочки, открытой с помощью UnixLabels.open_process_in.
- Начиная с версии 4.12
val process_out_pid : out_channel -> int
Возвращает PID процесса, открытого с помощью UnixLabels.open_process_args_out, или PID оболочки, открытой с помощью UnixLabels.open_process_out.
- Начиная с версии 4.12
val process_pid : in_channel * out_channel -> int
Возвращает PID процесса, открытого с помощью UnixLabels.open_process_args, или PID оболочки, открытой с помощью UnixLabels.open_process_args.
- Начиная с версии 4.12
val process_full_pid : in_channel * out_channel * in_channel -> int
Возвращает PID процесса, открытого с помощью UnixLabels.open_process_args_full, или PID оболочки, открытой с помощью UnixLabels.open_process_full.
- Начиная с версии 4.12
val close_process_in : in_channel -> process_status
Закрывает каналы, открытые с помощью UnixLabels.open_process_in, ожидает завершения связанной команды и возвращает статус её завершения.
val close_process_out : out_channel -> process_status
Закрывает каналы, открытые с помощью UnixLabels.open_process_out, ожидает завершения связанной команды и возвращает статус её завершения.
val close_process : in_channel * out_channel -> process_status
Закрывает каналы, открытые с помощью UnixLabels.open_process, ожидает завершения связанной команды и возвращает статус её завершения.
val close_process_full : in_channel * out_channel * in_channel -> process_status
Закрывает каналы, открытые с помощью UnixLabels.open_process_full, ожидает завершения связанной команды и возвращает статус её завершения.
Символические ссылки
val symlink : ?to_dir:bool -> src:string -> dst: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.
UnixLabels.has_symlink можно использовать, чтобы проверить, может ли процесс создавать символические ссылки.
val has_symlink : unit -> bool
Возвращает true, если пользователь может создавать символические ссылки. В Windows это означает, что у пользователя есть привилегия SeCreateSymbolicLinkPrivilege и, если необходимо, программа запущена с повышенными правами. На других платформах это просто означает, что доступен системный вызов symlink.
- Начиная с версии 4.03
val readlink : string -> string
Читает содержимое символической ссылки.
Опрос
val select : read:file_descr list -> write:file_descr list -> except:file_descr list -> timeout:float -> file_descr list * file_descr list * file_descr list
Ожидает, пока на некоторых каналах станет возможным выполнение операций ввода-вывода. Три аргумента-списка задают дескрипторы, которые нужно проверить соответственно на возможность чтения (первый аргумент), записи (второй аргумент) или наличие исключительных условий (третий аргумент). Четвёртый аргумент задаёт максимальное время ожидания в секундах; отрицательное значение четвёртого аргумента означает отсутствие тайм-аута (неограниченное ожидание). Результат состоит из трёх наборов дескрипторов: готовых к чтению (первый компонент), готовых к записи (второй компонент) и тех, для которых ожидает обработки исключительное условие (третий компонент).
В Windows, если один из списков дескрипторов содержит более FD_SETSIZE элементов (по умолчанию 64) или используется хотя бы один файловый дескриптор, не являющийся сокетом, максимальное время ожидания ограничивается значением 232 миллисекунд.
Блокировки
type lock_command = Unix.lock_command =
|
| F_ULOCK
| (* |
Снимает блокировку с области |
*) |
|
| F_LOCK
| (* |
Блокирует область для записи и ждёт, если она уже заблокирована |
*) |
|
| F_TLOCK
| (* |
Блокирует область для записи или завершается ошибкой, если она уже заблокирована |
*) |
|
| F_TEST
| (* |
Проверяет, заблокирована ли область другими процессами |
*) |
|
| F_RLOCK
| (* |
Блокирует область для чтения и ждёт, если она уже заблокирована |
*) |
|
| F_TRLOCK
| (* |
Блокирует область для чтения или завершается ошибкой, если она уже заблокирована |
*) |
Команды для UnixLabels.lockf.
val lockf : file_descr -> mode:lock_command -> len:int -> unit
lockf fd ~mode ~len устанавливает блокировку области файла, открытого как fd. Область начинается с текущей позиции чтения/записи для fd (устанавливаемой с помощью UnixLabels.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 : pid:int -> signal:Sys.signal -> unit
kill ~pid ~signal отправляет сигнал с номером signal процессу с идентификатором pid.
В Windows эмулируется только сигнал Sys.sigkill, в результате чего принимающий процесс завершается с кодом ERROR_PROCESS_ABORTED (1067). До OCaml 5.5 принимающий процесс завершался с кодом 0.
type sigprocmask_command = Unix.sigprocmask_command =
|
| SIG_SETMASK
|
|
| SIG_BLOCK
|
|
| SIG_UNBLOCK
|
val sigprocmask : mode: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 = Unix.process_times = {
tms_utime :
| (* |
Пользовательское время процесса |
*) | |
tms_stime :
| (* |
Системное время процесса |
*) | |
tms_cutime :
| (* |
Пользовательское время дочерних процессов |
*) | |
tms_cstime :
| (* |
Системное время дочерних процессов |
*) |
} Время выполнения процесса (процессорное время).
type tm = Unix.tm = {
tm_sec :
| (* |
Секунды 0..60 |
*) | |
tm_min :
| (* |
Минуты 0..59 |
*) | |
tm_hour :
| (* |
Часы 0..23 |
*) | |
tm_mday :
| (* |
День месяца 1..31 |
*) | |
tm_mon :
| (* |
Месяц года 0..11 |
*) | |
tm_year :
| (* |
Год минус 1900 |
*) | |
tm_wday :
| (* |
День недели (воскресенье — 0) |
*) | |
tm_yday :
| (* |
День года 0..365 |
*) | |
tm_isdst :
| (* |
Действует ли переход на летнее время |
*) |
} Тип, представляющий местное время и календарную дату.
val time : unit -> float
Возвращает текущее время в секундах с 00:00:00 GMT 1 января 1970 года.
val gettimeofday : unit -> float
То же, что и UnixLabels.time, но с точностью выше одной секунды.
val gmtime : float -> tm
Преобразует время в секундах, возвращаемое функцией UnixLabels.time, в дату и время. Предполагается UTC (всемирное координированное время), также известное как GMT. Для обратного преобразования задайте переменной окружения TZ значение "UTC", используйте UnixLabels.mktime, а затем восстановите исходное значение TZ.
val localtime : float -> tm
Преобразует время в секундах, возвращаемое функцией UnixLabels.time, в дату и время. Предполагается местный часовой пояс. Функция для обратного преобразования — UnixLabels.mktime.
val mktime : tm -> float * tm
Преобразует дату и время, заданные аргументом tm, во время в секундах, возвращаемое функцией UnixLabels.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.12
val times : unit -> process_times
Возвращает время выполнения процесса.
В Windows реализовано частично; время выполнения дочерних процессов не учитывается.
val utimes : string -> access:float -> modif:float -> unit
Устанавливает время последнего доступа (второй аргумент) и время последнего изменения (третий аргумент) файла. Время указывается в секундах с 00:00:00 GMT 1 января 1970 года. Если оба значения равны 0.0, время последнего доступа и последнего изменения устанавливаются в текущее время.
type interval_timer = Unix.interval_timer =
|
| ITIMER_REAL
| (* |
убывает в реальном времени и по истечении срока отправляет сигнал |
*) |
|
| ITIMER_VIRTUAL
| (* |
убывает во время виртуального выполнения процесса и по истечении срока отправляет |
*) |
|
| ITIMER_PROF
| (* |
(для профилирования) убывает как во время работы процесса, так и когда система работает для этого процесса; по истечении срока отправляет |
*) |
Три вида интервальных таймеров.
type interval_timer_status = Unix.interval_timer_status = {
it_interval :
| (* |
Период |
*) | |
it_value :
| (* |
Текущее значение таймера |
*) |
} Тип, описывающий состояние интервального таймера
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 = Unix.passwd_entry = {
pw_name :
| |
pw_passwd :
| |
pw_uid :
| |
pw_gid :
| |
pw_gecos :
| |
pw_dir :
| |
pw_shell :
|
} Структура записей в базе данных passwd.
type group_entry = Unix.group_entry = {
gr_name :
| |
gr_passwd :
| |
gr_gid :
| |
gr_mem :
|
} Структура записей в базе данных 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 = Unix.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
Возвращает печатное представление указанного интернет-адреса. Описание печатного представления см. в UnixLabels.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 = Unix.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 = Unix.socket_type =
|
| SOCK_STREAM
| (* |
Потоковый сокет |
*) |
|
| SOCK_DGRAM
| (* |
Дейтаграммный сокет |
*) |
|
| SOCK_RAW
| (* |
Сырой сокет |
*) |
|
| SOCK_SEQPACKET
| (* |
Сокет с пакетами, имеющими порядковые номера |
*) |
Типы сокетов, определяющие семантику обмена данными. SOCK_SEQPACKET включён для полноты, но редко поддерживается операционной системой и требует системных вызовов, недоступных в этой библиотеке.
type sockaddr = Unix.sockaddr =
|
| ADDR_UNIX of
|
|
| ADDR_INET of
|
Тип адресов сокетов. ADDR_UNIX name — это адрес сокета в домене Unix; name — имя файла в файловой системе. ADDR_INET(addr,port) — это адрес сокета в интернет-домене; addr — интернет-адрес машины, а port — номер порта.
val socket : ?cloexec:bool -> domain:socket_domain -> kind:socket_type -> protocol:int -> file_descr
Создаёт новый сокет в указанном домене и с указанным типом. Третий аргумент — тип протокола; значение 0 выбирает протокол по умолчанию для сокетов этого типа. Документацию по необязательному аргументу cloexec см. в UnixLabels.set_close_on_exec.
val domain_of_sockaddr : sockaddr -> socket_domain
Возвращает домен сокета, подходящий для указанного адреса сокета.
val socketpair : ?cloexec:bool -> domain:socket_domain -> kind:socket_type -> protocol:int -> file_descr * file_descr
Создаёт пару неименованных сокетов, соединённых друг с другом. Документацию по необязательному аргументу cloexec см. в UnixLabels.set_close_on_exec.
val accept : ?cloexec:bool -> file_descr -> file_descr * sockaddr
Принимает соединения на указанном сокете. Возвращённый дескриптор — это сокет, соединённый с клиентом; возвращённый адрес — адрес подключившегося клиента. Документацию по необязательному аргументу cloexec см. в UnixLabels.set_close_on_exec.
val bind : file_descr -> addr:sockaddr -> unit
Привязывает сокет к адресу.
val connect : file_descr -> addr:sockaddr -> unit
Подключает сокет к адресу.
val listen : file_descr -> max:int -> unit
Настраивает сокет для приёма запросов на подключение. Целочисленный аргумент задаёт максимальное число ожидающих запросов.
type shutdown_command = Unix.shutdown_command =
|
| SHUTDOWN_RECEIVE
| (* |
Закрыть для приёма |
*) |
|
| SHUTDOWN_SEND
| (* |
Закрыть для отправки |
*) |
|
| SHUTDOWN_ALL
| (* |
Закрыть в обоих направлениях |
*) |
Тип команд для shutdown.
val shutdown : file_descr -> mode:shutdown_command -> unit
Завершает соединение сокета. Значение SHUTDOWN_SEND во втором аргументе приводит к тому, что операции чтения на другом конце соединения возвращают признак конца файла. Значение SHUTDOWN_RECEIVE приводит к тому, что операции записи на другом конце соединения возвращают ошибку закрытого канала (сигнал SIGPIPE).
val getsockname : file_descr -> sockaddr
Возвращает адрес указанного сокета.
val getpeername : file_descr -> sockaddr
Возвращает адрес узла, подключённого к указанному сокету.
type msg_flag = Unix.msg_flag =
|
| MSG_OOB
|
|
| MSG_DONTROUTE
|
|
| MSG_PEEK
|
Флаги для UnixLabels.recv, UnixLabels.recvfrom, UnixLabels.send и UnixLabels.sendto.
val recv : file_descr -> buf:bytes -> pos:int -> len:int -> mode:msg_flag list -> int
Получает данные из подключённого сокета.
val recvfrom : file_descr -> buf:bytes -> pos:int -> len:int -> mode:msg_flag list -> int * sockaddr
Получает данные из неподключённого сокета.
val send : file_descr -> buf:bytes -> pos:int -> len:int -> mode:msg_flag list -> int
Отправляет данные через подключённый сокет.
val send_substring : file_descr -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> int
То же, что и send, но данные берутся из строки, а не из последовательности байтов.
- Начиная с версии 4.02
val sendto : file_descr -> buf:bytes -> pos:int -> len:int -> mode:msg_flag list -> addr:sockaddr -> int
Отправляет данные через неподключённый сокет.
val sendto_substring : file_descr -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> sockaddr -> int
То же, что и sendto, но данные берутся из строки, а не из последовательности байтов.
- Начиная с версии 4.02
Параметры сокетов
type socket_bool_option = Unix.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
| (* |
Разрешить повторное использование привязок адреса и порта.
|
*) |
Параметры сокета, которые можно получить с помощью UnixLabels.getsockopt и изменить с помощью UnixLabels.setsockopt. Эти параметры имеют булево значение (true/false).
type socket_int_option = Unix.socket_int_option =
|
| SO_SNDBUF
| (* |
Размер буфера отправки |
*) |
|
| SO_RCVBUF
| (* |
Размер буфера приёма |
*) |
|
| SO_ERROR
| (* |
Устарело. Используйте вместо этого Unix.getsockopt_error. Устарело. Используйте вместо этого |
*) |
|
| SO_TYPE
| (* |
Возвращает тип сокета |
*) |
|
| SO_RCVLOWAT
| (* |
Минимальное число байтов для обработки операций ввода |
*) |
|
| SO_SNDLOWAT
| (* |
Минимальное число байтов для обработки операций вывода |
*) |
Параметры сокета, которые можно получить с помощью UnixLabels.getsockopt_int и изменить с помощью UnixLabels.setsockopt_int. Эти параметры имеют целочисленное значение.
type socket_optint_option = Unix.socket_optint_option =
|
| SO_LINGER
| (* |
Следует ли сохранять закрытые соединения с имеющимися данными и на какой срок (в секундах) |
*) |
Параметры сокета, которые можно получить с помощью UnixLabels.getsockopt_optint и изменить с помощью UnixLabels.setsockopt_optint. Эти параметры имеют значение типа int option, где None означает «отключено».
type socket_float_option = Unix.socket_float_option =
|
| SO_RCVTIMEO
| (* |
Тайм-аут операций ввода |
*) |
|
| SO_SNDTIMEO
| (* |
Тайм-аут операций вывода |
*) |
Параметры сокета, которые можно получить с помощью UnixLabels.getsockopt_float и изменить с помощью UnixLabels.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
То же, что и UnixLabels.getsockopt, для параметра сокета с целочисленным значением.
val setsockopt_int : file_descr -> socket_int_option -> int -> unit
То же, что и UnixLabels.setsockopt, для параметра сокета с целочисленным значением.
val getsockopt_optint : file_descr -> socket_optint_option -> int option
То же, что и UnixLabels.getsockopt, для параметра сокета, значение которого имеет тип int option.
val setsockopt_optint : file_descr -> socket_optint_option -> int option -> unit
То же, что и UnixLabels.setsockopt, для параметра сокета, значение которого имеет тип int option.
val getsockopt_float : file_descr -> socket_float_option -> float
То же, что и UnixLabels.getsockopt, для параметра сокета со значением с плавающей точкой.
val setsockopt_float : file_descr -> socket_float_option -> float -> unit
То же, что и UnixLabels.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
«Завершает» соединение, установленное с помощью UnixLabels.open_connection; то есть передаёт признак конца файла серверу, который выполняет чтение на другом конце соединения. Это не закрывает сокет и каналы, используемые соединением. О том, как закрыть их после завершения соединения, см. Unix.open_connection.
val establish_server : (in_channel -> out_channel -> unit) -> addr:sockaddr -> unit
Запускает сервер по указанному адресу. Функция, переданная в качестве первого аргумента, вызывается для каждого соединения и получает два буферизованных канала, соединённых с клиентом. Для каждого соединения создаётся новый процесс. Функция UnixLabels.establish_server обычно не возвращает управление.
Два канала, переданные функции, используют общий дескриптор сокета. Функции не нужно закрывать каналы, поскольку они закрываются автоматически при её возврате. Если функция предпочитает закрыть каналы явно, ей следует закрыть выходной канал с помощью close_out, оставив входной канал открытым по причинам, описанным в Unix.in_channel_of_descr.
-
Вызывает исключение
Invalid_argumentв Windows. Вместо этого используйте потоки.
Базы данных узлов и протоколов
type host_entry = Unix.host_entry = {
h_name :
| |
h_aliases :
| |
h_addrtype :
| |
h_addr_list :
|
} Структура записей в базе данных hosts.
type protocol_entry = Unix.protocol_entry = {
p_name :
| |
p_aliases :
| |
p_proto :
|
} Структура записей в базе данных protocols.
type service_entry = Unix.service_entry = {
s_name :
| |
s_aliases :
| |
s_port :
| |
s_proto :
|
} Структура записей в базе данных 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 -> protocol:string -> service_entry
Находит запись в services с указанным именем.
-
Вызывает исключение
Not_found, если такая запись не существует.
val getservbyport : int -> protocol:string -> service_entry
Находит запись в services с указанным номером службы.
-
Вызывает исключение
Not_found, если такая запись не существует.
type addr_info = Unix.addr_info = {
ai_family :
| (* |
Домен сокета |
*) | |
ai_socktype :
| (* |
Тип сокета |
*) | |
ai_protocol :
| (* |
Номер протокола сокета |
*) | |
ai_addr :
| (* |
Адрес |
*) | |
ai_canonname :
| (* |
Каноническое имя узла |
*) |
} Информация об адресе, возвращаемая функцией UnixLabels.getaddrinfo.
type getaddrinfo_option = Unix.getaddrinfo_option =
|
| AI_FAMILY of
| (* |
Задать указанный домен сокета |
*) |
|
| AI_SOCKTYPE of
| (* |
Задать указанный тип сокета |
*) |
|
| AI_PROTOCOL of
| (* |
Задать указанный протокол |
*) |
|
| AI_NUMERICHOST
| (* |
Не вызывать службу разрешения имён; ожидать числовой IP-адрес |
*) |
|
| AI_CANONNAME
| (* |
Заполнить поле |
*) |
|
| AI_PASSIVE
| (* |
Задать адрес «любой» для использования с |
*) |
Параметры для UnixLabels.getaddrinfo.
val getaddrinfo : string -> string -> getaddrinfo_option list -> addr_info list
getaddrinfo host service opts возвращает список записей UnixLabels.addr_info, описывающих параметры сокета и адреса, подходящие для связи с указанными узлом и службой. Пустой список возвращается, если имена узла или службы неизвестны либо ограничения, заданные в opts, не могут быть выполнены.
host — это либо имя узла, либо строковое представление IP-адреса. host может быть пустой строкой; в этом случае используется адрес «любой» или адрес «loopback» в зависимости от того, содержит ли opts значение AI_PASSIVE. service — это либо имя службы, либо строковое представление номера порта. service может быть пустой строкой; в этом случае поле порта возвращаемых адресов устанавливается в 0. opts — это, возможно, пустой список параметров, позволяющий вызывающей стороне задать определённый домен сокета (например, только IPv6 или только IPv4) либо определённый тип сокета (например, только TCP или только UDP).
type name_info = Unix.name_info = {
ni_hostname :
| (* |
Имя или IP-адрес узла |
*) | |
ni_service :
| (* |
Имя службы или номер порта |
*) |
} Информация об узле и службе, возвращаемая функцией UnixLabels.getnameinfo.
type getnameinfo_option = Unix.getnameinfo_option =
|
| NI_NOFQDN
| (* |
Не дополнять локальные имена узлов доменом |
*) |
|
| NI_NUMERICHOST
| (* |
Всегда возвращать адрес узла в виде IP-адреса |
*) |
|
| NI_NAMEREQD
| (* |
Завершить работу с ошибкой, если имя узла определить невозможно |
*) |
|
| NI_NUMERICSERV
| (* |
Всегда возвращать службу в виде номера порта |
*) |
|
| NI_DGRAM
| (* |
Считать службу использующей UDP вместо TCP по умолчанию |
*) |
Параметры для UnixLabels.getnameinfo.
val getnameinfo : sockaddr -> getnameinfo_option list -> name_info
getnameinfo addr opts возвращает имя узла и имя службы, соответствующие адресу сокета addr. opts — это, возможно, пустой список параметров, определяющих способ получения этих имён.
-
Вызывает исключение
Not_foundпри возникновении ошибки.
Терминальный интерфейс
Следующие функции реализуют стандартный терминальный интерфейс POSIX. Они обеспечивают управление асинхронными портами связи и псевдотерминалами. Полное описание см. на странице руководства termios.
type terminal_io = Unix.terminal_io = {
mutable c_ignbrk :
| (* |
Игнорировать условие прерывания. |
*) | |
mutable c_brkint :
| (* |
Посылать сигнал при условии прерывания. |
*) | |
mutable c_ignpar :
| (* |
Игнорировать символы с ошибками чётности. |
*) | |
mutable c_parmrk :
| (* |
Помечать ошибки чётности. |
*) | |
mutable c_inpck :
| (* |
Включить проверку чётности при вводе. |
*) | |
mutable c_istrip :
| (* |
Удалять 8-й бит входных символов. |
*) | |
mutable c_inlcr :
| (* |
Преобразовывать NL в CR при вводе. |
*) | |
mutable c_igncr :
| (* |
Игнорировать CR при вводе. |
*) | |
mutable c_icrnl :
| (* |
Преобразовывать CR в NL при вводе. |
*) | |
mutable c_ixon :
| (* |
Распознавать символы XON/XOFF при вводе. |
*) | |
mutable c_ixoff :
| (* |
Передавать символы XON/XOFF для управления потоком ввода. |
*) | |
mutable c_opost :
| (* |
Включить обработку вывода. |
*) | |
mutable c_obaud :
| (* |
Скорость передачи при выводе (0 означает закрытие соединения). |
*) | |
mutable c_ibaud :
| (* |
Скорость передачи при вводе. |
*) | |
mutable c_csize :
| (* |
Число битов на символ (5–8). |
*) | |
mutable c_cstopb :
| (* |
Число стоповых битов (1–2). |
*) | |
mutable c_cread :
| (* |
Приём включён. |
*) | |
mutable c_parenb :
| (* |
Включить формирование и обнаружение бита чётности. |
*) | |
mutable c_parodd :
| (* |
Использовать нечётную, а не чётную чётность. |
*) | |
mutable c_hupcl :
| (* |
Разрывать соединение при последнем закрытии. |
*) | |
mutable c_clocal :
| (* |
Игнорировать сигналы состояния модема. |
*) | |
mutable c_isig :
| (* |
Генерировать сигнал при INTR, QUIT, SUSP. |
*) | |
mutable c_icanon :
| (* |
Включить каноническую обработку (буферизацию строк и редактирование) |
*) | |
mutable c_noflsh :
| (* |
Отключить очистку буферов после INTR, QUIT, SUSP. |
*) | |
mutable c_echo :
| (* |
Отображать вводимые символы. |
*) | |
mutable c_echoe :
| (* |
Отображать ERASE (для удаления предыдущего символа). |
*) | |
mutable c_echok :
| (* |
Отображать KILL (для удаления текущей строки). |
*) | |
mutable c_echonl :
| (* |
Отображать NL, даже если c_echo не установлен. |
*) | |
mutable c_vintr :
| (* |
Символ прерывания (обычно Ctrl-C). |
*) | |
mutable c_vquit :
| (* |
Символ выхода (обычно Ctrl-\). |
*) | |
mutable c_verase :
| (* |
Символ удаления (обычно DEL или Ctrl-H). |
*) | |
mutable c_vkill :
| (* |
Символ удаления строки (обычно Ctrl-U). |
*) | |
mutable c_veof :
| (* |
Символ конца файла (обычно Ctrl-D). |
*) | |
mutable c_veol :
| (* |
Альтернативный символ конца строки (обычно отсутствует). |
*) | |
mutable c_vmin :
| (* |
Минимальное число символов, которое необходимо прочитать для выполнения запроса на чтение. |
*) | |
mutable c_vtime :
| (* |
Максимальное время ожидания чтения (в единицах по 0,1 с). |
*) | |
mutable c_vstart :
| (* |
Символ запуска (обычно Ctrl-Q). |
*) | |
mutable c_vstop :
| (* |
Символ остановки (обычно Ctrl-S). |
*) |
} val tcgetattr : file_descr -> terminal_io
Возвращает состояние терминала, на который указывает заданный файловый дескриптор.
-
Вызывает
Invalid_argumentв Windows
type setattr_when = Unix.setattr_when =
|
| TCSANOW
|
|
| TCSADRAIN
|
|
| TCSAFLUSH
|
val tcsetattr : file_descr -> mode:setattr_when -> terminal_io -> unit
Задаёт состояние терминала, на который указывает заданный файловый дескриптор. Второй аргумент указывает, когда вступает в силу изменение состояния: немедленно (TCSANOW), после передачи всего ожидающего вывода (TCSADRAIN) или после очистки всех полученных, но ещё не прочитанных входных данных (TCSAFLUSH). TCSADRAIN рекомендуется при изменении параметров вывода; TCSAFLUSH — при изменении параметров ввода.
-
Вызывает
Invalid_argumentв Windows
val tcsendbreak : file_descr -> duration:int -> unit
Отправляет сигнал BREAK через заданный файловый дескриптор. Второй аргумент задаёт длительность сигнала в единицах по 0,1 с; значение 0 означает стандартную длительность (0,25 с).
-
Вызывает
Invalid_argumentв Windows
val tcdrain : file_descr -> unit
Ожидает, пока все данные, записанные через заданный файловый дескриптор, не будут переданы.
-
Вызывает
Invalid_argumentв Windows
type flush_queue = Unix.flush_queue =
|
| TCIFLUSH
|
|
| TCOFLUSH
|
|
| TCIOFLUSH
|
val tcflush : file_descr -> mode:flush_queue -> unit
Отбрасывает данные, записанные через заданный файловый дескриптор, но ещё не переданные, либо полученные, но ещё не прочитанные, в зависимости от второго аргумента: TCIFLUSH очищает полученные, но не прочитанные данные, TCOFLUSH очищает записанные, но не переданные данные, а TCIOFLUSH очищает и те и другие.
-
Вызывает
Invalid_argumentв Windows
type flow_action = Unix.flow_action =
|
| TCOOFF
|
|
| TCOON
|
|
| TCIOFF
|
|
| TCION
|
val tcflow : file_descr -> mode: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/UnixLabels.html