Модуль 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
| (* |
Слишком много ссылок: нельзя вставить |
*) |
|
| 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.
- Since 4.12
val getenv : string -> string
Возвращает значение, связанное с переменной в среде выполнения процесса, если у процесса нет особых привилегий.
-
Raises
Not_foundесли переменная не определена или у процесса есть особые привилегии. Эта функция идентичнаSys.getenv.
val unsafe_getenv : string -> string
Возвращает значение, ассоциированное с переменной в среде процесса.
В отличие от UnixLabels.getenv, эта функция возвращает значение даже если у процесса есть особые привилегии. Она считается небезопасной, потому что программисту программы с установленным setuid или setgid необходимо быть внимательным, чтобы избежать использования злонамеренно составленных переменных окружения в пути поиска исполняемых файлов, местоположении временных файлов или логов, и тому подобном.
- Since 4.06
-
Raises
Not_foundесли переменная не определена.
val putenv : string -> string -> unit
putenv name value устанавливает значение, ассоциированное с переменной в среде процесса. name — имя переменной окружения, а value — ее новое связанное значение.
Обработка процессов
type process_status = Unix.process_status =
|
| WEXITED of
| (* |
Процесс завершился нормально, значение аргумента — код возврата. |
*) |
|
| WSIGNALED of
| (* |
Процесс был завершен сигналом; аргумент — номер сигнала. |
*) |
|
| WSTOPPED of
| (* |
Процесс был остановлен сигналом; аргумент — номер сигнала. |
*) |
Статус завершения процесса. См. модуль Sys для определений стандартных номеров сигналов. Обратите внимание, что это не номера, используемые ОС.
В Windows: используется только WEXITED (поскольку межпроцессных сигналов нет), но с определёнными кодами возврата, указывающими на особые причины завершения. Ищите значения NTSTATUS в документации Windows, чтобы расшифровать такие коды возврата ошибок. В частности, код ошибки 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_*.
-
Raises
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, то дочерний процесс может оказаться в поврежденном состоянии.
-
Raises
-
Invalid_argumentв Windows. ИспользуйтеUnixLabels.create_processили потоки вместо этого. -
Failureесли был запущен любой домен.
-
val wait : unit -> int * process_status
Ожидать, пока один из дочерних процессов умрёт, и возвратить его pid и статус завершения.
-
Raises
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, когда дочерний процесс сталкивается с критической ошибкой и должен выйти. В этом случае предпочтительно не выполнять никаких действий финализации в дочернем процессе, так как эти действия могут вмешиваться в аналогичные действия, выполняемые родительским процессом. Например, каналы вывода не должны быть сброшены дочерним процессом, так как родительский процесс может сбросить их позже, что приведёт к дублированию вывода.
- Since 4.12
val getpid : unit -> int
Возвращает pid процесса.
val getppid : unit -> int
Возвращает pid родительского процесса.
-
Raises
Invalid_argumentв Windows (поскольку это бессмысленно)
val nice : int -> int
Изменить приоритет процесса. Целочисленный аргумент добавляется к значению «nice». (Более высокие значения «nice» означают более низкие приоритеты.) Возвращается новое значение nice.
-
Raises
Invalid_argumentв Windows
Основные операции ввода/вывода файлов
type file_descr = 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
| (* |
Обнулить длину до 0, если файл существует |
*) |
|
| 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
Очистить буферы файла в диск.
- Since 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.
- Since 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.
- Since 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, но считывает данные из строки, а не последовательности байтов.
- Since 4.02
val single_write_substring : file_descr -> buf:string -> pos:int -> len:int -> int
Аналогично UnixLabels.single_write, но считывает данные из строки, а не последовательности байтов.
- Since 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.
- Since 5.2
Взаимодействие с библиотекой стандартного ввода-вывода
val in_channel_of_descr : file_descr -> in_channel
Создайте канал ввода, читающий из заданного дескриптора. Канал изначально в бинарном режиме; используйте set_binary_mode_in ic false для текстового режима. Текстовый режим поддерживается только если дескриптор ссылается на файл или канал, но не поддерживается, если он ссылается на сокет.
В Windows: set_binary_mode_in всегда завершается неудачно для каналов, созданных с помощью этой функции.
Обратите внимание, что каналы ввода буферизованы, поэтому из дескриптора может быть прочитано больше символов, чем доступно с помощью функций канала. Каналы также сохраняют копию текущей позиции в файле.
Закрытие канала ic возвращённого in_channel_of_descr fd с помощью close_in ic также закрывает базовый дескриптор fd. Некорректно закрывать как канал ic, так и дескриптор fd.
Если несколько каналов созданы на одном дескрипторе, один из каналов должен быть закрыт, но не другие. Рассмотрим, например, дескриптор s подключенный к сокету и два канала ic = in_channel_of_descr s и oc = out_channel_of_descr s. Рекомендуемый протокол закрытия - выполнить close_out oc, который сбрасывает буферизованный вывод в сокет, а затем закрывает сокет. Канал ic не должен быть закрыт и будет собран сборщиком мусора.
val out_channel_of_descr : file_descr -> out_channel
Создайте канал вывода, записывающий в заданный дескриптор. Канал изначально в бинарном режиме; используйте set_binary_mode_out oc false для текстового режима. Текстовый режим поддерживается только если дескриптор ссылается на файл или канал, но не поддерживается, если он ссылается на сокет.
В Windows: set_binary_mode_out всегда завершается неудачно для каналов, созданных с помощью этой функции.
Обратите внимание, что каналы вывода буферизованы, поэтому вам может потребоваться вызвать flush, чтобы убедиться, что все данные были отправлены в дескриптор. Каналы также сохраняют копию текущей позиции в файле.
Закрытие канала oc возвращённого out_channel_of_descr fd с помощью close_out oc также закрывает базовый дескриптор fd. Некорректно закрывать как канал ic, так и дескриптор fd.
См. Unix.in_channel_of_descr для обсуждения протокола закрытия, когда несколько каналов созданы на одном дескрипторе.
val descr_of_in_channel : in_channel -> file_descr
Возвращает дескриптор, соответствующий каналу ввода.
val descr_of_out_channel : out_channel -> file_descr
Возвращает дескриптор, соответствующий каналу вывода.
Поиск и обрезка
type seek_command = 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 : | (* |
Номер узла |
*) | |
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.
Доступ к массиву проверяется на границах, но границы определяются начальным вызовом UnixLabels.map_file. Поэтому следует убедиться, что ни один другой процесс не изменяет мапированный файл во время доступа, в противном случае может быть вызван сигнал SIGBUS. Это происходит, например, если файл уменьшен.
Invalid_argument или Failure могут быть вызваны в случаях, когда проверка аргументов не удается.
- Since 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.
-
Raises
-
ENOSYSНа Unix если~follow:_запрашивается, но linkat недоступен. -
ENOSYSНа Windows если~follow:falseзапрашивается.
-
follow : указывает, следует ли следовать src символической ссылке или создаётся жёсткая ссылка на сам src. На Unix системах это делается с помощью функции linkat(2). Если ?follow не предоставлен, то используется функция link(2), поведение которой зависит от ОС, но она более широко доступна.val realpath : string -> string
realpath p — абсолютный путь к p, полученный путём разрешения всех дополнительных символов /, относительных частей пути и символических ссылок.
- Since 4.13
Права и владение файлами
type access_permission = 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
Изменить права открытого файла.
-
Raises
Invalid_argumentв Windows
val chown : string -> uid:int -> gid:int -> unit
Изменить владельца и группу владельца указанного файла.
-
Raises
Invalid_argumentв Windows
val fchown : file_descr -> uid:int -> gid:int -> unit
Изменить владельца и группу владельца открытого файла.
-
Raises
Invalid_argumentв Windows
val umask : file_perm -> file_perm
Установить и вернуть предыдущее значение маски создания режима файла процесса.
-
Raises
Invalid_argumentв Windows
val access : string -> perm:access_permission list -> unit
Проверить, обладает ли процесс указанными правами над указанным файлом.
В Windows: разрешение на выполнение X_OK проверить нельзя, вместо этого проверяется только разрешение на чтение.
-
Raises
Unix_errorв противном случае.
Операции с дескрипторами файлов
val dup : ?cloexec:bool -> file_descr -> file_descr
Возвращает новый дескриптор файла, ссылающийся на тот же файл, что и заданный дескриптор. См. UnixLabels.set_close_on_exec для документации по необязательному аргументу cloexec.
val dup2 : ?cloexec:bool -> src:file_descr -> dst:file_descr -> unit
dup2 ~src ~dst дублирует src в dst, закрывая dst если он уже открыт. См. UnixLabels.set_close_on_exec для документации по необязательному аргументу cloexec.
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» для данного дескриптора. Дескриптор с флагом «закрыть при exec» автоматически закрывается, когда текущий процесс запускает другую программу с помощью одной из функций exec, create_process и open_process.
Часто утечка дескрипторов файлов, открытых, скажем, на частном файле, в стороннюю программу является брешью в безопасности: программа получает доступ к частному файлу и может совершить плохие действия с ним. Поэтому настоятельно рекомендуется устанавливать для всех дескрипторов файлов флаг «закрыть при exec», за исключением очень немногих случаев, когда дескриптор файла действительно необходимо передать другой программе.
Лучший способ установить для дескриптора файла флаг «закрыть при exec» — создать его в этом состоянии. Для этого функция openfile имеет флаги O_CLOEXEC и O_KEEPEXEC для принудительного включения режима «закрыть при exec» или «сохранить при exec», соответственно. Все остальные операции в модуле Unix, создающие дескрипторы файлов, имеют необязательный аргумент ?cloexec:bool, чтобы указать, должен ли дескриптор файла создаваться в режиме «закрыть при exec» (записью ~cloexec:true) или в режиме «сохранить при exec» (записью ~cloexec:false). По историческим причинам, режим создания дескриптора файлов по умолчанию — «сохранить при exec», если необязательный аргумент cloexec не указан. Это не безопасный по умолчанию режим, поэтому настоятельно рекомендуется передавать явные аргументы cloexec в операции, создающие дескрипторы файлов.
Необязательные аргументы cloexec и флаг O_KEEPEXEC были добавлены в OCaml 4.05. Раньше распространённой практикой было создание дескрипторов файлов в режиме по умолчанию «сохранить при exec», затем вызов set_close_on_exec для этих свежесозданных дескрипторов файлов. Это не так безопасно, как создание дескриптора файла в режиме «закрыть при exec», потому что в многопоточных программах существует окно уязвимости между моментом создания дескриптора файла и завершением set_close_on_exec. Если другой поток запускает другую программу в течение этого окна, дескриптор будет просочиться, так как он всё ещё находится в режиме «сохранить при exec».
Что касается гарантий атомарности, предоставляемых функцией ~cloexec:true или флагом O_CLOEXEC, на всех платформах гарантируется, что одновременно выполняющийся поток Caml не может утечь дескриптор, запустив новый процесс. На Linux эта гарантия распространяется на одновременно выполняющиеся потоки C. По состоянию на февраль 2017 года другие операционные системы не имеют необходимых системных вызовов и по-прежнему подвержены риску утечки в период, когда поток C видит только что созданный дескриптор файла в режиме «сохранить при exec».
val clear_close_on_exec : file_descr -> unit
Снимает флаг «закрыть при exec» с данного дескриптора. См. 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
Изменяет корневую директорию процесса.
-
Raises
Invalid_argumentв Windows
type dir_handle = Unix.dir_handle
Тип дескрипторов для открытых каталогов.
val opendir : string -> dir_handle
Открывает дескриптор каталога
val readdir : dir_handle -> string
Возвращает следующую запись в каталоге.
-
Raises
End_of_fileпри достижении конца каталога.
val rewinddir : dir_handle -> unit
Перемещает дескриптор в начало каталога
val closedir : dir_handle -> unit
Закрывает дескриптор каталога.
Каналы и перенаправления
val pipe : ?cloexec:bool -> unit -> file_descr * file_descr
Создаёт канал. Первый компонент результата открыт для чтения, это выход из канала. Второй компонент открыт для записи, это вход в канал. См. UnixLabels.set_close_on_exec для документации по необязательному аргументу cloexec.
val mkfifo : string -> perm:file_perm -> unit
Создаёт именованный канал с заданными правами (см. UnixLabels.umask).
-
Raises
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). ИД нового процесса возвращается немедленно; новый процесс выполняется параллельно с текущим процессом. Стандартный ввод и выводы нового процесса подключаются к дескрипторам stdin, stdout и stderr. Передача, например, Unix.stdout для stdout предотвращает перенаправление и заставляет новый процесс иметь тот же стандартный вывод, что и текущий процесс. Исполняемый файл create_process ~prog ~args ~stdin ~stdout ~stderr ищется в пути. Новый процесс имеет ту же среду, что и текущий процесс.
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_args_in можно использовать в качестве более надёжной и эффективной альтернативы UnixLabels.open_process_in.
val open_process_out : string -> out_channel
Аналогично UnixLabels.open_process_in, но перенаправляет стандартный ввод команды в канал. Данные, записанные в возвращённый выходной канал, отправляются на стандартный ввод команды. Предупреждение: записи в выходные каналы буферизируются, поэтому следует обращаться к flush в нужное время, чтобы обеспечить правильную синхронизацию. Если команде не нужно выполнять через оболочку, UnixLabels.open_process_args_out можно использовать вместо UnixLabels.open_process_out.
val open_process : string -> in_channel * out_channel
Аналогично UnixLabels.open_process_out, но перенаправляет как стандартный ввод, так и стандартный вывод команды в каналы, подключённые к двум возвращаемым каналам. Входной канал подключен к выводу команды, а выходной канал – к вводу команды. Если команде не нужно выполнять через оболочку, UnixLabels.open_process_args можно использовать вместо UnixLabels.open_process.
val open_process_full : string -> env:string array -> in_channel * out_channel * in_channel
Аналогично UnixLabels.open_process, но второй аргумент определяет среду, переданную команде. Результатом является тройка каналов, подключённых соответственно к стандартному выводу, стандартному вводу и стандартной ошибке команды. Если команде не нужно выполнять через оболочку, UnixLabels.open_process_args_full можно использовать вместо UnixLabels.open_process_full.
val open_process_args : string -> string array -> in_channel * out_channel
open_process_args prog args запускает программу prog с аргументами args. Обратите внимание, что первый аргумент, args.(0), по соглашению является именем файла исполняемой программы, так же как и Sys.argv.(0). Новый процесс выполняется параллельно с текущим процессом. Стандартный ввод и вывод нового процесса перенаправляются в каналы, которые можно соответственно читать и записывать через возвращаемые каналы. Входной канал подключен к выводу программы, а выходной канал – к вводу программы.
Предупреждение: записи в выходные каналы буферизируются, поэтому следует обращаться к flush в нужное время, чтобы обеспечить правильную синхронизацию.
Исполняемый файл prog ищется в пути. Это поведение изменилось в 4.12; ранее prog искался только в текущем каталоге.
Новый процесс имеет ту же среду, что и текущий процесс.
- Since 4.08
val open_process_args_in : string -> string array -> in_channel
Аналогично UnixLabels.open_process_args, но перенаправляет только стандартный вывод нового процесса.
- Since 4.08
val open_process_args_out : string -> string array -> out_channel
Аналогично UnixLabels.open_process_args, но перенаправляет только стандартный ввод нового процесса.
- Since 4.08
val open_process_args_full : string -> string array -> string array -> in_channel * out_channel * in_channel
Аналогично UnixLabels.open_process_args, но третий аргумент задаёт среду, переданную новому процессу. Результатом является тройка каналов, подключённых соответственно к стандартному выводу, стандартному вводу и стандартной ошибке программы.
- Since 4.08
val process_in_pid : in_channel -> int
Возвращает идентификатор процесса, открытого с помощью UnixLabels.open_process_args_in, или идентификатор оболочки, открытой с помощью UnixLabels.open_process_in.
- Since 4.12
val process_out_pid : out_channel -> int
Возвращает идентификатор процесса, открытого с помощью UnixLabels.open_process_args_out, или идентификатор оболочки, открытой с помощью UnixLabels.open_process_out.
- Since 4.12
val process_pid : in_channel * out_channel -> int
Возвращает идентификатор процесса, открытого с помощью UnixLabels.open_process_args, или идентификатор оболочки, открытой с помощью UnixLabels.open_process_args.
- Since 4.12
val process_full_pid : in_channel * out_channel * in_channel -> int
Возвращает идентификатор процесса, открытого с помощью UnixLabels.open_process_args_full, или идентификатор оболочки, открытой с помощью UnixLabels.open_process_full.
- Since 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 доступен.
- Since 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
Ожидание, пока некоторые операции ввода-вывода станут возможными на некоторых каналах. Три списка аргументов соответственно представляют набор дескрипторов, проверяемых на чтение (первый аргумент), запись (второй аргумент) или исключительные условия (третий аргумент). Четвёртый аргумент – максимальная задержка в секундах; отрицательный четвёртый аргумент означает отсутствие таймаута (неограниченное ожидание). Результат состоит из трёх наборов дескрипторов: готовые к чтению (первый компонент), готовые к записи (второй компонент) и те, для которых ожидается исключительное состояние (третий компонент).
Блокировка
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:int -> unit
kill ~pid ~signal отправляет сигнал с номером signal процессу с идентификатором pid.
В Windows: эмулируется только сигнал Sys.sigkill.
type sigprocmask_command = Unix.sigprocmask_command =
|
| SIG_SETMASK
|
|
| SIG_BLOCK
|
|
| SIG_UNBLOCK
|
val sigprocmask : mode:sigprocmask_command -> int list -> int list
sigprocmask ~mode sigs изменяет набор заблокированных сигналов. Если mode равно SIG_SETMASK, заблокированные сигналы устанавливаются на те, которые находятся в списке sigs. Если mode равно SIG_BLOCK, сигналы в sigs добавляются к набору заблокированных сигналов. Если mode равно SIG_UNBLOCK, сигналы в sigs удаляются из набора заблокированных сигналов. sigprocmask возвращает набор ранее заблокированных сигналов.
При загрузке версии systhreads модуля Thread, эта функция перенаправляется на Thread.sigmask. То есть, sigprocmask изменяет только маску текущего потока.
-
Raises
Invalid_argumentна Windows (нет межпроцессорных сигналов в Windows)
val sigpending : unit -> int list
Возвращает набор заблокированных сигналов, которые в настоящее время ожидают обработки.
-
Raises
Invalid_argumentна Windows (нет межпроцессорных сигналов в Windows)
val sigsuspend : int list -> unit
sigsuspend sigs атомарно устанавливает заблокированные сигналы на sigs и ожидает, пока не будет доставлен неигнорируемый, незаблокированный сигнал. При возвращении заблокированные сигналы сбрасываются до своего начального значения.
-
Raises
Invalid_argumentна Windows (нет межпроцессорных сигналов в Windows)
val pause : unit -> unit
Ожидать, пока не будет доставлен неигнорируемый, незаблокированный сигнал.
-
Raises
Invalid_argumentна Windows (нет межпроцессорных сигналов в Windows)
Функции времени
type process_times = 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 по Гринвичу, 1 января 1970 года, в секундах.
val gettimeofday : unit -> float
То же, что и UnixLabels.time, но с разрешением лучше, чем 1 секунда.
val gmtime : float -> tm
Преобразует время в секундах, возвращаемое UnixLabels.time, в дату и время. Предполагается UTC (Координированное универсальное время), также известное как Гринвичское время. Для выполнения обратного преобразования установите переменную среды 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 по Гринвичу, 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
Установите реальный и эффективный идентификаторы пользователя для процесса.
-
Raises
Invalid_argumentна Windows
val getgid : unit -> int
Возвращает идентификатор группы пользователя, выполняющего процесс.
В Windows: всегда возвращает 1.
val getegid : unit -> int
Возвращает эффективный идентификатор группы, под которым выполняется процесс.
В Windows: всегда возвращает 1.
val setgid : int -> unit
Установите реальный и эффективный идентификаторы группы для процесса.
-
Raises
Invalid_argumentна Windows
val getgroups : unit -> int array
Возвращает список групп, к которым принадлежит пользователь, выполняющий процесс.
В Windows: всегда возвращает [|1|].
val setgroups : int array -> unit
setgroups groups устанавливает дополнительные идентификаторы групп для вызывающего процесса. Требуются соответствующие привилегии.
-
Raises
Invalid_argumentна Windows
val initgroups : string -> int -> unit
initgroups user group инициализирует список доступа к группам, считывая базу данных групп /etc/group и используя все группы, членом которых является user. Дополнительная группа group также добавляется в список.
-
Raises
Invalid_argumentна Windows
type passwd_entry = 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 с заданным именем.
-
Raises
Not_foundесли такая запись не существует, или всегда в Windows.
val getgrnam : string -> group_entry
Найти запись в group с заданным именем.
-
Raises
Not_foundесли такая запись не существует, или всегда в Windows.
val getpwuid : int -> passwd_entry
Найти запись в passwd с заданным идентификатором пользователя.
-
Raises
Not_foundесли такая запись не существует, или всегда в Windows.
val getgrgid : int -> group_entry
Найти запись в group с заданным идентификатором группы.
-
Raises
Not_foundесли такая запись не существует, или всегда в Windows.
Интернет-адреса
type inet_addr = Unix.inet_addr
Абстрактный тип интернет-адресов.
val inet_addr_of_string : string -> inet_addr
Преобразование из печатного представления интернет-адреса во внутреннее представление. Строка аргумента состоит из 4 чисел, разделенных точками (XXX.YYY.ZZZ.TTT) для адресов IPv4 и до 8 чисел, разделенных двоеточиями, для адресов IPv6.
-
Raises
Failureпри вводе строки, которая не соответствует этим форматам.
val string_of_inet_addr : inet_addr -> string
Возвращает печатное представление данного интернет-адреса. См. 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
Является ли данный inet_addr IPv6-адресом.
- Since 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
| (* |
Сокет 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 выбирает протокол по умолчанию для данного типа сокетов. См. UnixLabels.set_close_on_exec для документации по необязательному аргументу cloexec.
val domain_of_sockaddr : sockaddr -> socket_domain
Возвращает домен сокета, подходящий для данного адреса сокета.
val socketpair : ?cloexec:bool -> domain:socket_domain -> kind:socket_type -> protocol:int -> file_descr * file_descr
Создаёт пару безымянных сокетов, соединённых между собой. См. UnixLabels.set_close_on_exec для документации по необязательному аргументу cloexec.
val accept : ?cloexec:bool -> file_descr -> file_descr * sockaddr
Принимает соединения на заданном сокете. Возвращаемый дескриптор — это сокет, соединённый с клиентом; возвращённый адрес — адрес подключающегося клиента. См. UnixLabels.set_close_on_exec для документации по необязательному аргументу cloexec.
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, но получает данные из строки вместо последовательности байтов.
- Since 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, но получает данные из строки вместо последовательности байтов.
- Since 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
| (* |
Управление алгоритмом Nagle для 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 может быть задано как пустая строка; в этом случае используется адрес ``любой'' или адрес ``обратной связи'', в зависимости от того, содержит ли 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 — это, возможно, пустой список параметров, который управляет тем, как эти имена получаются.
-
Raises
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 :
| (* |
Эхо УДАЛИТЬ (для стирания текущей строки). |
*) | |
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
Возвращает состояние терминала, на который ссылается указанный дескриптор файла.
-
Raises
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, когда изменяются параметры ввода.
-
Raises
Invalid_argumentна Windows
val tcsendbreak : file_descr -> duration:int -> unit
Отправляет условие прерывания на указанный дескриптор файла. Второй аргумент — продолжительность прерывания в единицах 0,1 с; 0 означает стандартную продолжительность (0,25 с).
-
Raises
Invalid_argumentна Windows
val tcdrain : file_descr -> unit
Ожидает, пока весь вывод, записанный в указанный дескриптор файла, не будет передан.
-
Raises
Invalid_argumentна Windows
type flush_queue = Unix.flush_queue =
|
| TCIFLUSH
|
|
| TCOFLUSH
|
|
| TCIOFLUSH
|
val tcflush : file_descr -> mode:flush_queue -> unit
Удаляет данные, записанные в указанный дескриптор файла, но еще не переданные, или данные, полученные, но еще не прочитанные, в зависимости от второго аргумента: TCIFLUSH сбрасывает полученные, но не прочитанные данные, TCOFLUSH сбрасывает данные, записанные, но не переданные, и TCIOFLUSH сбрасывает оба типа данных.
-
Raises
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 для возобновления ввода.
-
Raises
Invalid_argumentна Windows
val setsid : unit -> int
Переводит вызывающий процесс в новую сессию и отсоединяет его от контролирующего терминала.
-
Raises
Invalid_argumentна Windows
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/UnixLabels.html