Модуль 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.0
val getenv : string -> string
Возвращает значение, связанное с переменной в среде процесса, если у процесса нет специальных привилегий.
-
Raises
Not_found, если переменная не определена или у процесса есть специальные привилегии. Эта функция идентичнаSys.getenv.
val unsafe_getenv : string -> string
Возвращает значение, связанное с переменной в среде процесса.
В отличие от UnixLabels.getenv, эта функция возвращает значение даже если у процесса есть особые привилегии. Она считается небезопасной, так как программист программы с установленным setuid или setgid должен быть внимателен, чтобы избежать использования вредоносно созданных переменных окружения в пути поиска исполняемых файлов, местах для временных файлов или логов, и т. п.
- Since 4.06.0
-
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 для определений стандартных номеров сигналов. Обратите внимание, что они не являются номерами, используемыми ОС.
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 и текущей средой процесса. Эти execv* функции никогда не возвращаются: при успехе текущая программа заменяется новой.
-
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 дочернего процесса для родительского процесса.
-
Raises
Invalid_argumentв Windows. ИспользуйтеUnixLabels.create_processили потоки вместо этого.
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 run-time также не завершается.
Типичное использование Unix._exit — после операции Unix.fork, когда дочерний процесс сталкивается с ошибкой и должен завершиться. В этом случае предпочтительно не выполнять никаких действий финализации в дочернем процессе, поскольку эти действия могут конфликтовать с аналогичными действиями, выполняемыми родительским процессом. Например, каналы вывода не должны сбрасываться дочерним процессом, так как родительский процесс может сбросить их позже, что приведёт к дублированию вывода.
- Since 4.12.0
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
| (* |
Не делать этого устройства управляющим tty |
*) |
|
| 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.0
val read : file_descr -> buf:bytes -> pos:int -> len:int -> int
read fd ~buf ~pos ~len читает len байтов из дескриптора fd, сохраняя их в последовательности байтов buf, начиная с позиции pos в buf. Возвращает количество фактически прочитанных байтов.
val write : file_descr -> buf:bytes -> pos:int -> len:int -> int
write fd ~buf ~pos ~len записывает len байтов в дескриптор fd, беря их из последовательности байтов buf, начиная с позиции pos в buff. Возвращает количество фактически записанных байтов. write повторяет операцию записи до тех пор, пока все байты не будут записаны или не произойдёт ошибка.
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.0
val single_write_substring : file_descr -> buf:string -> pos:int -> len:int -> int
То же, что и UnixLabels.single_write, но данные берутся из строки вместо последовательности байтов.
- Since 4.02.0
Взаимодействие с стандартной библиотекой ввода/вывода
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, изменения, внесенные в массив, выполняются только в памяти, с использованием копирования при записи изменённых страниц; подлежащий файл не затрагивается.
Genarray.map_file намного эффективнее, чем чтение всего файла в Bigarray, изменение этого Bigarray и последующая запись.
Для автоматического изменения размеров Bigarray до фактического размера файла, основная размерность (то есть первая размерность для массива с C-структурой и последняя размерность для массива с Fortran-структурой) может быть задана как -1. Genarray.map_file затем определяет основную размерность из размера файла. Файл должен содержать целое число подмассивов, как определено неосновными размерностями, в противном случае поднимается Failure.
Если все размерности Bigarray заданы, размер файла сравнивается с размером Bigarray. Если файл больше Bigarray, в Bigarray отображается только начальная часть файла. Если файл меньше Bigarray, файл автоматически увеличивается до размера Bigarray. Это требует прав на запись для fd.
Доступы к массиву проверяются на границы, но границы определяются начальным вызовом map_file. Поэтому вы должны убедиться, что ни один другой процесс не изменяет отображаемый файл во время доступа, иначе может быть вызван сигнал SIGBUS. Это происходит, например, если файл уменьшен.
Invalid_argument или Failure могут быть подняты в случаях, когда проверка аргументов завершается неудачей.
- Since 4.06.0
Операции с именами файлов
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.0
Права доступа и владение файлами
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
Изменить идентификаторы владельца UID и GID указанного файла.
-
Raises
Invalid_argumentв Windows
val fchown : file_descr -> uid:int -> gid:int -> unit
Изменить идентификаторы владельца UID и GID открытого файла.
-
Raises
Invalid_argumentв Windows
val umask : int -> int
Установить маску создания режима файла процесса и вернуть предыдущую маску.
-
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. Идентификатор нового процесса возвращается немедленно; новый процесс выполняется параллельно с текущим процессом. Стандартный ввод и выводы нового процесса подключаются к дескрипторам 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_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_in : string -> string array -> in_channel
open_process_args_in prog args запускает программу prog с аргументами args. Новый процесс выполняется одновременно с текущим процессом. Стандартный вывод нового процесса перенаправляется в канал, который можно прочитать через возвращаемый входной канал.
Исполняемый файл prog ищется в пути. Это поведение изменилось в версии 4.12; ранее prog искался только в текущем каталоге.
Новый процесс имеет ту же среду, что и текущий процесс.
- Since 4.08.0
val open_process_args_out : string -> string array -> out_channel
Аналогично UnixLabels.open_process_args_in, но перенаправляет стандартный ввод нового процесса в канал. Данные, записанные в возвращаемый выходной канал, отправляются на стандартный ввод программы. Предупреждение: записи в выходные каналы буферизуются, поэтому будьте внимательны, чтобы вызывать flush в нужные моменты, чтобы обеспечить правильную синхронизацию.
- Since 4.08.0
val open_process_args : string -> string array -> in_channel * out_channel
Аналогично UnixLabels.open_process_args_out, но перенаправляет и стандартный ввод, и стандартный вывод нового процесса в каналы, соединённые с двумя возвращаемыми каналами. Входной канал подключен к выводу программы, а выходной канал — к вводу программы.
- Since 4.08.0
val open_process_args_full : string -> string array -> string array -> in_channel * out_channel * in_channel
Аналогично UnixLabels.open_process_args, но третий аргумент определяет среду, переданную новому процессу. Результатом является тройка каналов, соединённых соответственно со стандартным выводом, стандартным вводом и стандартной ошибкой программы.
- Since 4.08.0
val process_in_pid : in_channel -> int
Возвращает pid процесса, открытого с помощью UnixLabels.open_process_in или UnixLabels.open_process_args_in.
- Since 4.12.0
val process_out_pid : out_channel -> int
Возвращает pid процесса, открытого с помощью UnixLabels.open_process_out или UnixLabels.open_process_args_out.
- Since 4.12.0
val process_pid : in_channel * out_channel -> int
Возвращает pid процесса, открытого с помощью UnixLabels.open_process или UnixLabels.open_process_args.
- Since 4.12.0
val process_full_pid : in_channel * out_channel * in_channel -> int
Возвращает pid процесса, открытого с помощью UnixLabels.open_process_full или UnixLabels.open_process_args_full.
- Since 4.12.0
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.0
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_RLOCK пытаются установить блокировку на запись в указанной области. Команды F_TLOCK и 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 возвращает набор ранее заблокированных сигналов.
При загрузке модуля Thread с версией systhreads, эта функция перенаправляется на Thread.sigmask. То есть, sigprocmask изменяет только маску текущей нити.
-
Raises
Invalid_argumentв Windows (нет межпроцессорных сигналов в Windows)
val sigpending : unit -> int list
Возвращает набор заблокированных сигналов, которые в настоящее время ожидают обработки.
-
Raises
Invalid_argumentв Windows (нет межпроцессорных сигналов в Windows)
val sigsuspend : int list -> unit
sigsuspend sigs атомарно устанавливает заблокированные сигналы на sigs и ожидает, пока не будет доставлен неигнорируемый, не заблокированный сигнал. По возвращении заблокированные сигналы сбрасываются до их исходного значения.
-
Raises
Invalid_argumentв Windows (нет межпроцессорных сигналов в Windows)
val pause : unit -> unit
Ожидает, пока не будет доставлен неигнорируемый, не заблокированный сигнал.
-
Raises
Invalid_argumentв Windows (нет межпроцессорных сигналов в Windows)
Функции времени
type process_times = 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.0
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
Устанавливает реальный идентификатор пользователя и эффективный идентификатор пользователя для процесса.
-
Возбуждает
Invalid_argumentв Windows
val getgid : unit -> int
Возвращает идентификатор группы пользователя, выполняющего процесс.
В Windows: всегда возвращает 1.
val getegid : unit -> int
Возвращает эффективную группу ID, под которой работает процесс.
В 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
Является ли данный inet_addr IPv6-адресом.
- С 4.12.0
Сокеты
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 выбирает протокол по умолчанию для этого типа сокетов. См. 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.
-
Возбуждает
Invalid_argumentв Windows
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.0
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.0
Параметры сокета
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
| (* |
Устарело. Используйте |
*) |
|
| 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.
-
Raises
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 с заданным именем.
-
Raises
Not_found, если такая запись не существует.
val gethostbyaddr : inet_addr -> host_entry
Найдите запись в hosts с заданным адресом.
-
Raises
Not_found, если такая запись не существует.
val getprotobyname : string -> protocol_entry
Найдите запись в protocols с заданным именем.
-
Raises
Not_found, если такая запись не существует.
val getprotobynumber : int -> protocol_entry
Найдите запись в protocols с заданным номером протокола.
-
Raises
Not_found, если такая запись не существует.
val getservbyname : string -> protocol:string -> service_entry
Найдите запись в services с заданным именем.
-
Raises
Not_found, если такая запись не существует.
val getservbyport : int -> protocol:string -> service_entry
Найдите запись в services с заданным номером службы.
-
Raises
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 — это, возможно, пустой список опций, определяющий, как эти имена получаются.
-
Возможные исключения
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
Возвращает состояние терминала, связанного с заданным дескриптором файла.
-
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-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/UnixLabels.html