Module Core__Core_unix
This file is a modified version of unixLabels.mli from the OCaml distribution. Many of these functions raise exceptions but do not have a _exn suffixed name.
module File_descr : sig ... endFile descriptor.
Error report
type error= Unix.error=
val sexp_of_error : Unix.error -> Core__.Import.Sexp.tval error_of_sexp : Core__.Import.Sexp.t -> Unix.error
module Error : sig ... endexceptionUnix_error of Error.t * string * stringRaised by the system calls below when an error is encountered. The first component is the error code; the second component is the function name; the third component is the string parameter to the function, if it has one, or the empty string otherwise.
module Syscall_result : module type of Core__.Syscall_result with type 'a Syscall_result.t = 'a Core__.Syscall_result.tval unix_error : int -> string -> string -> _- raises Unix_error
with a given errno, function name and argument
val error_message : Error.t -> stringval handle_unix_error : (unit -> 'a) -> 'ahandle_unix_error frunsf ()and returns the result. If the exceptionUnix_erroris raised, it prints a message describing the error and exits with code 2.
Access to the process environment
If you're looking for getenv, that's in the Sys module.
val environment : unit -> string arrayReturn the process environment, as an array of strings with the format ``variable=value''. The returned array is empty if the process has special privileges.
Process handling
module Exit : sig ... endThe termination status of a process.
module Exit_or_signal : sig ... endmodule Exit_or_signal_or_stop : sig ... endtype env=[|`Replace of (string * string) list|`Extend of (string * string) list|`Override of (string * string option) list|`Replace_raw of string list]envis used to control the environment of a child process, and can take four forms.`Replace_rawreplaces the entire environment with strings in the Unix style, like"VARIABLE_NAME=value".`Replacehas the same effect as`Replace_raw, but using bindings represented as"VARIABLE_NAME", "value".`Extendadds entries to the existing environment rather than replacing the whole environment.`Overrideis similar to`Extendbut allows unsetting variables too.If
envcontains multiple bindings for the same variable, the last takes precedence. In the case of`Extend, bindings inenvtake precedence over the existing environment.
val sexp_of_env : env -> Ppx_sexp_conv_lib.Sexp.tval env_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> envval __env_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> env
val exec : prog:string -> argv:string list -> ?use_path:bool -> ?env:env -> unit -> Core__.Import.never_returnsexec ~prog ~argv ?search_path ?envexecsprogwithargv. Ifuse_path = true(the default) andprogdoesn't contain a slash, thenexecsearches thePATHenvironment variable forprog. Ifenvis supplied, it determines the environment whenprogis executed.The first element in
argvshould be the program itself; the correct way to callexecis:exec ~prog ~argv:[ prog; arg1; arg2; ...] ()
val fork_exec : prog:string -> argv:string list -> ?use_path:bool -> ?env:env -> unit -> Core__.Import.Pid.tfork_exec ~prog ~argv ?use_path ?env ()forks and execsprogwithargvin the child process, returning the child PID to the parent. As inexec, the first element inargvshould be the program itself.
val fork : unit -> [ `In_the_child | `In_the_parent of Core__.Import.Pid.t ]fork ()forks a new process. The return value indicates whether we are continuing in the child or the parent, and if the parent, includes the child's process id.
type wait_on=[|`Any|`Group of Core__.Import.Pid.t|`My_group|`Pid of Core__.Import.Pid.t]
val sexp_of_wait_on : wait_on -> Ppx_sexp_conv_lib.Sexp.tval wait_on_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> wait_onval __wait_on_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> wait_on
val wait : ?restart:bool -> wait_on -> Core__.Import.Pid.t * Exit_or_signal.tval wait_nohang : wait_on -> (Core__.Import.Pid.t * Exit_or_signal.t) optionval wait_untraced : ?restart:bool -> wait_on -> Core__.Import.Pid.t * Exit_or_signal_or_stop.tval wait_nohang_untraced : wait_on -> (Core__.Import.Pid.t * Exit_or_signal_or_stop.t) optionval waitpid : Core__.Import.Pid.t -> Exit_or_signal.twaitpid pidwaits for child processpidto terminate, and returns its exit status.waitpid_exnis likewaitpid, except it only returns if the child exits with status zero, and raises if the child terminates in any other way.
val waitpid_exn : Core__.Import.Pid.t -> unitval system : string -> Exit_or_signal.tExecute the given command, wait until it terminates, and return its termination status. The string is interpreted by the shell
/bin/shand therefore can contain redirections, quotes, variables, etc. The resultWEXITED 127indicates that the shell couldn't be executed.
val getpid : unit -> Core__.Import.Pid.tReturn the pid of the process.
val getppid : unit -> Core__.Import.Pid.t optionReturn the pid of the parent process.
val getppid_exn : unit -> Core__.Import.Pid.tReturn the pid of the parent process, if you're really sure you're never going to be the init process.
module Thread_id : sig ... endval gettid : (unit -> Thread_id.t) Core__.Import.Or_error.tGet the numeric ID of the current thread, e.g. for identifying it in top(1).
Basic file input/output
val stdin : File_descr.tFile descriptor for standard input.
val stdout : File_descr.tFile descriptor for standard output.
val stderr : File_descr.tFile descriptor for standard standard error.
type open_flag= Unix.open_flag=|O_RDONLYOpen for reading
|O_WRONLYOpen for writing
|O_RDWROpen for reading and writing
|O_NONBLOCKOpen in non-blocking mode
|O_APPENDOpen for append
|O_CREATCreate if nonexistent
|O_TRUNCTruncate to 0 length if existing
|O_EXCLFail if existing
|O_NOCTTYDon't make this dev a controlling tty
|O_DSYNCWrites complete as `Synchronised I/O data integrity completion'
|O_SYNCWrites complete as `Synchronised I/O file integrity completion'
|O_RSYNCReads complete as writes (depending on O_SYNC/O_DSYNC)
|O_SHARE_DELETEWindows only: allow the file to be deleted while still open
|O_CLOEXECSet the close-on-exec flag on the descriptor returned by
openfile|O_KEEPEXEC
val open_flag_of_sexp : Core__.Import.Sexp.t -> open_flagWe can't use
with sexpbecause pa_sexp inserts two copies of thevalspecs, which leads to a spurious "unused" warning.
val sexp_of_open_flag : open_flag -> Core__.Import.Sexp.t
val sexp_of_file_perm : file_perm -> Ppx_sexp_conv_lib.Sexp.tval file_perm_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> file_perm
val openfile : ?perm:file_perm -> mode:open_flag list -> string -> File_descr.tOpen the named file with the given flags. Third argument is the permissions to give to the file if it is created. Return a file descriptor on the named file. Default permissions 0o644.
module Open_flags : sig ... endval fcntl_getfl : File_descr.t -> Open_flags.tfcntl_getfl fdgets the current flags forfdfrom the open-file-descriptor table via the system callfcntl(fd, F_GETFL). See "man fcntl".
val fcntl_setfl : File_descr.t -> Open_flags.t -> unitfcntl_setfl fd flagssets the flags forfdin the open-file-descriptor table via the system callfcntl(fd, F_SETFL, flags). See "man fcntl". As per the Linux man page, on Linux this only allowsappendandnonblockto be set.
val close : ?restart:bool -> File_descr.t -> unitClose a file descriptor.
val with_file : ?perm:file_perm -> string -> mode:open_flag list -> f:(File_descr.t -> 'a) -> 'awith_file file ~mode ~perm ~fopensfile, and appliesfto the resulting file descriptor. Whenffinishes (or raises),with_filecloses the descriptor and returns the result off(or raises).
val read : ?restart:bool -> ?pos:int -> ?len:int -> File_descr.t -> buf:Core__.Import.Bytes.t -> intread fd buff ofs lenreadslencharacters from descriptorfd, storing them in stringbuff, starting at positionofsin stringbuff. Return the number of characters actually read.
val write : ?pos:int -> ?len:int -> File_descr.t -> buf:Core__.Import.Bytes.t -> intwrite fd buff ofs lenwriteslencharacters to descriptorfd, taking them from bytesbuff, starting at positionofsin bytesbuff. Return the number of characters actually written.When an error is reported some characters might have already been written. Use
single_writeinstead to ensure that this is not the case.WARNING: write is an interruptible call and has no way to handle EINTR properly. You should most probably be using single write.
val write_substring : ?pos:int -> ?len:int -> File_descr.t -> buf:string -> intSame as
writebut with a string buffer.
val single_write : ?restart:bool -> ?pos:int -> ?len:int -> File_descr.t -> buf:Core__.Import.Bytes.t -> intSame as
writebut ensures that all errors are reported and that no character has ever been written when an error is reported.
val single_write_substring : ?restart:bool -> ?pos:int -> ?len:int -> File_descr.t -> buf:string -> intSame as
single_writebut with a string buffer.
Interfacing with the standard input/output library
val in_channel_of_descr : File_descr.t -> Core__.Import.In_channel.tCreate an input channel reading from the given descriptor. The channel is initially in binary mode; use
set_binary_mode_in ic falseif text mode is desired.
val out_channel_of_descr : File_descr.t -> Core__.Import.Out_channel.tCreate an output channel writing on the given descriptor. The channel is initially in binary mode; use
set_binary_mode_out oc falseif text mode is desired.
val descr_of_in_channel : Core__.Import.In_channel.t -> File_descr.tReturn the descriptor corresponding to an input channel.
val descr_of_out_channel : Core__.Import.Out_channel.t -> File_descr.tReturn the descriptor corresponding to an output channel.
Seeking and truncating
type seek_command= Unix.seek_command=|SEEK_SETindicates positions relative to the beginning of the file
|SEEK_CURindicates positions relative to the current position
|SEEK_ENDindicates positions relative to the end of the file
POSITIONING modes for
UnixLabels.lseek.
val sexp_of_seek_command : seek_command -> Ppx_sexp_conv_lib.Sexp.tval seek_command_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> seek_command
val lseek : File_descr.t -> int64 -> mode:seek_command -> int64Set the current position for a file descriptor
val ftruncate : File_descr.t -> len:int64 -> unitTruncates the file corresponding to the given descriptor to the given size.
File statistics
type file_kind= Unix.file_kind=|S_REGRegular file
|S_DIRDirectory
|S_CHRCharacter device
|S_BLKBlock device
|S_LNKSymbolic link
|S_FIFONamed pipe
|S_SOCKSocket
val sexp_of_file_kind : file_kind -> Ppx_sexp_conv_lib.Sexp.tval file_kind_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> file_kind
type stats= Unix.LargeFile.stats={st_dev : int;Device number
st_ino : int;Inode number
st_kind : file_kind;Kind of the file
st_perm : file_perm;Access rights
st_nlink : int;Number of links
st_uid : int;User id of the owner
st_gid : int;Group ID of the file's group
st_rdev : int;Device minor number
st_size : int64;Size in bytes
st_atime : float;Last access time
st_mtime : float;Last modification time
st_ctime : float;Last status change time
}The informations returned by the
UnixLabels.stat calls. The times arefloatnumber of seconds since the epoch; we don't useTime.tbecauseTimedepends onUnix, so the fix isn't so trivial. Same forNative_file.statsbelow.
val sexp_of_stats : stats -> Ppx_sexp_conv_lib.Sexp.tval stats_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> stats
val stat : string -> statsReturn the information for the named file.
val lstat : string -> statsSame as
UnixLabels.stat, but in case the file is a symbolic link, return the information for the link itself.
val fstat : File_descr.t -> statsReturn the information for the file associated with the given descriptor.
module Native_file : sig ... endThis sub-module provides the normal OCaml Unix functions that deal with file size using native ints. These are here because, in general, you should be using 64bit file operations so that large files aren't an issue. If you have a real need to use potentially 31bit file operations (and you should be dubious of such a need) you can open this module
Locking
type lock_command= Unix.lock_command=Commands for
lockf.
val sexp_of_lock_command : lock_command -> Ppx_sexp_conv_lib.Sexp.tval lock_command_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> lock_command
val lockf : File_descr.t -> mode:lock_command -> len:Core__.Import.Int64.t -> unitlockf fd cmd sizeplace a lock on a file_descr that prevents any other process from calling lockf successfully on the same file. Due to a limitation in the current implementation the length will be converted to a native int, potentially throwing an exception if it is too large.
module Flock_command : sig ... endval flock : File_descr.t -> Flock_command.t -> boolflock fd cmdplaces or releases a lock on the fd as per the flock C call of the same name.
val isatty : File_descr.t -> boolReturn
trueif the given file descriptor refers to a terminal or console window,falseotherwise.
Mapping files into memory
val map_file : File_descr.t -> ?pos:int64 -> ('a, 'b) Stdlib.Bigarray.kind -> 'c Stdlib.Bigarray.layout -> shared:bool -> int array -> ('a, 'b, 'c) Stdlib.Bigarray.Genarray.tMemory mapping of a file as a big array.
map_file fd kind layout ~shared dimsreturns a big array of kindkind, layoutlayout, and dimensions as specified indims.The data contained in this big array are the contents of the file referred to by the file descriptor
fd.The optional
posparameter is the byte offset in the file of the data being mapped. It defaults to 0.If
sharedistrue, all modifications performed on the array are reflected in the file. This requires thatfdbe opened with write permissions. Ifsharedisfalse, modifications performed on the array are done in memory only, using copy-on-write of the modified pages; the underlying file is not affected.To adjust automatically the dimensions of the big array to the actual size of the file, the major dimension (that is, the first dimension for an array with C layout, and the last dimension for an array with Fortran layout) can be given as
-1.map_filethen determines the major dimension from the size of the file. The file must contain an integral number of sub-arrays as determined by the non-major dimensions, otherwiseFailureis raised. If all dimensions of the big array are given, the file size is matched against the size of the big array. If the file is larger than the big array, only the initial portion of the file is mapped to the big array. If the file is smaller than the bigarray, the file is automatically grown to the size of the big array. This requires write permissions onfd.Array accesses are bounds-checked, but the bounds are determined by the initial call to
map_file. Therefore, you should make sure no other process modifies the mapped file while you're accessing it, or a SIGBUS signal may be raised. This happens, for instance, if the file is shrunk.Invalid_argumentorFailuremay be raised in cases where argument validation fails.- since
- 4.05.0
Operations on file names
val rename : src:string -> dst:string -> unitrename old newchanges the name of a file fromoldtonew.
val link : ?force:bool -> target:string -> link_name:string -> unit -> unitlink ?force ~target ~link_name ()creates a hard link namedlink_nameto the file namedtarget. Ifforceis true, an existing entry in place oflink_namewill be unlinked. This unlinking may raise a Unix error, e.g. if the entry is a directory.
File permissions and ownership
val chmod : string -> perm:file_perm -> unitChange the permissions of the named file.
val fchmod : File_descr.t -> perm:file_perm -> unitChange the permissions of an opened file.
val chown : string -> uid:int -> gid:int -> unitChange the owner uid and owner gid of the named file.
val fchown : File_descr.t -> uid:int -> gid:int -> unitChange the owner uid and owner gid of an opened file.
val access : string -> [ `Read | `Write | `Exec | `Exists ] list -> (unit, exn) Core__.Import.Result.tCheck that the process has the given permissions over the named file.
Operations on file descriptors
val dup : File_descr.t -> File_descr.tReturn a new file descriptor referencing the same file as the given descriptor.
val dup2 : src:File_descr.t -> dst:File_descr.t -> unitdup2 ~src ~dstduplicatessrctodst, closingdstif already opened.
val set_nonblock : File_descr.t -> unitSet the ``non-blocking'' flag on the given descriptor. When the non-blocking flag is set, reading on a descriptor on which there is temporarily no data available raises the
EAGAINorEWOULDBLOCKerror instead of blocking; writing on a descriptor on which there is temporarily no room for writing also raisesEAGAINorEWOULDBLOCK.
val clear_nonblock : File_descr.t -> unitClear the ``non-blocking'' flag on the given descriptor. See
UnixLabels.set_nonblock.
val set_close_on_exec : File_descr.t -> unitSet the ``close-on-exec'' flag on the given descriptor. A descriptor with the close-on-exec flag is automatically closed when the current process starts another program with one of the
execfunctions.
val clear_close_on_exec : File_descr.t -> unitClear the ``close-on-exec'' flag on the given descriptor. See
UnixLabels.set_close_on_exec.
Directories
val mkdir : ?perm:file_perm -> string -> unitCreate a directory. The permissions of the created directory are (perm & ~umask & 0777). The default perm is 0777.
val mkdir_p : ?perm:file_perm -> string -> unitCreate a directory recursively. The permissions of the created directory are those granted by
mkdir ~perm.
val opendir : ?restart:bool -> string -> dir_handleOpen a descriptor on a directory
val readdir_opt : dir_handle -> string optionReturn the next entry in a directory. Returns
Nonewhen the end of the directory has been reached.
val readdir : dir_handle -> stringSame as
readdir_optexcept that it signals the end of the directory by raisingEnd_of_file.
val rewinddir : dir_handle -> unitReposition the descriptor to the beginning of the directory
val closedir : dir_handle -> unitClose a directory descriptor.
Pipes and redirections
val pipe : unit -> File_descr.t * File_descr.tCreate a pipe. The first component of the result is opened for reading, that's the exit to the pipe. The second component is opened for writing, that's the entrance to the pipe.
val mkfifo : string -> perm:file_perm -> unitCreate a named pipe with the given permissions.
High-level process and redirection management
module Process_info : sig ... endval create_process : prog:string -> args:string list -> Process_info.tcreate_process ~prog ~argsforks a new process that executes the programprogwith argumentsargs. The function returns the pid of the process along with file descriptors attached to stdin, stdout, and stderr of the new process. The executable fileprogis searched for in the path. The new process has the same environment as the current process. Unlike inexecvethe program name is automatically passed as the first argument.
val create_process_env : ?working_dir:string -> ?prog_search_path:string list -> ?argv0:string -> prog:string -> args:string list -> env:env -> unit -> Process_info.tcreate_process_env ~prog ~args ~envascreate_process, but takes an additional parameter that extends or replaces the current environment. No effort is made to ensure that the keys passed in as env are unique, so if an environment variable is set twice the second version will override the first. Ifargv0is given, it is used (instead ofprog) as the first element of theargvarray passed toexecve.The exact program to execute is determined using the usual conventions. More precisely, if
progcontains at least one '/' character then it is used as is (relative toworking_dirifprogis a relative path, absolute otherwise). Note thatworking_dirdefaults to the working directory of the current process, i.e.getcwd (). Ifprogcontains no '/' character, then it is looked up inprog_search_path: for the firstdirinprog_search_pathsuch thatFilename.concat dir progexists and is executable,Filename.concat dir progis the program that will be executed.prog_search_pathdefaults to the list of directories encoded as a ':' separated list in the "PATH" environment variable of the current running process. If no such variable is defined, then["/bin"; "/usr/bin"]is used instead. Note that the "PATH" environment variable is looked up in the environment of the current running process, i.e. via
getenv "PATH". Setting the "PATH" variable in theenvargument of this function has no effect on howprogis resolved.In a setuid or setgid program, or one which has inherited such privileges, reading of the PATH variable will return an empty result. If a search path is required then it should be provided explicitly using
prog_search_pathin such scenarios; alternatively, perhaps more satisfactorily, an absolute path should be given asprog.
val open_process_in : string -> Core__.Import.In_channel.tHigh-level pipe and process management. These functions (with
UnixLabels.open_process_out andUnixLabels.open_process) run the given command in parallel with the program, and return channels connected to the standard input and/or the standard output of the command. The command is interpreted by the shell/bin/sh(cf.system). Warning: writes on channels are buffered, hence be careful to callCaml.flush at the right times to ensure correct synchronization.
val open_process_out : string -> Core__.Import.Out_channel.tSee
UnixLabels.open_process_in.
val open_process : string -> Core__.Import.In_channel.t * Core__.Import.Out_channel.tSee
UnixLabels.open_process_in.
module Process_channels : sig ... endSimilar to
UnixLabels.open_process, but the second argument specifies the environment passed to the command. The result is a triple of channels connected to the standard output, standard input, and standard error of the command.
val open_process_full : string -> env:string array -> Process_channels.t
val close_process_in : Core__.Import.In_channel.t -> Exit_or_signal.tClose channels opened by
UnixLabels.open_process_in, wait for the associated command to terminate, and return its termination status.
val close_process_out : Core__.Import.Out_channel.t -> Exit_or_signal.tClose channels opened by
UnixLabels.open_process_out, wait for the associated command to terminate, and return its termination status.
val close_process : (Core__.Import.In_channel.t * Core__.Import.Out_channel.t) -> Exit_or_signal.tClose channels opened by
UnixLabels.open_process, wait for the associated command to terminate, and return its termination status.
val close_process_full : Process_channels.t -> Exit_or_signal.tClose channels opened by
UnixLabels.open_process_full, wait for the associated command to terminate, and return its termination status.
Symbolic links
Polling
module Select_fds : sig ... endtype select_timeout=[|`Never|`Immediately|`After of Core_kernel.Time_ns.Span.t]
val sexp_of_select_timeout : select_timeout -> Ppx_sexp_conv_lib.Sexp.t
val select : ?restart:bool -> read:File_descr.t list -> write:File_descr.t list -> except:File_descr.t list -> timeout:select_timeout -> unit -> Select_fds.tWait until some input/output operations become possible on some channels. The three list arguments are a set of descriptors to check for reading, for writing, or for exceptional conditions.
~timeoutis the maximal timeout. The result is composed of three sets of descriptors: those ready for reading, ready for writing, and over which an exceptional condition is pending.Setting restart to true means that we want
selectto restart automatically on EINTR (instead of propagating the exception)...
Time functions
type process_times= Unix.process_times={}The execution times (CPU times) of a process.
val sexp_of_process_times : process_times -> Ppx_sexp_conv_lib.Sexp.tval process_times_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> process_times
module Clock : sig ... endtype tm= Unix.tm={}The type representing wallclock time and calendar date.
val sexp_of_tm : tm -> Ppx_sexp_conv_lib.Sexp.tval tm_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> tm
val gettimeofday : unit -> floatSame as
timeabove, but with resolution better than 1 second.
val gmtime : float -> tmConvert a time in seconds, as returned by
UnixLabels.time, into a date and a time. Assumes UTC.
val timegm : tm -> floatConvert a UTC time in a tm record to a time in seconds
val localtime : float -> tmConvert a time in seconds, as returned by
UnixLabels.time, into a date and a time. Assumes the local time zone.
val mktime : tm -> float * tmConvert a date and time, specified by the
tmargument, into a time in seconds, as returned byUnixLabels.time. Also return a normalized copy of the giventmrecord, with thetm_wday,tm_yday, andtm_isdstfields recomputed from the other fields. Thetmargument is interpreted in the local time zone.
val strftime : tm -> string -> stringConvert a date and time, specified by the
tmargument, into a formatted string. See 'man strftime' for format options.
val strptime : fmt:string -> string -> Unix.tmGiven a format string, convert a corresponding string to a date and time See 'man strptime' for format options.
val nanosleep : float -> floatnanosleep fdelays execution of the program for at leastfseconds. The function can return earlier if a signal has been delivered, in which case the number of seconds left is returned. Any other failure raises an exception.
val times : unit -> process_timesReturn the execution times of the process.
val utimes : string -> access:float -> modif:float -> unitSet the last access time (second arg) and last modification time (third arg) for a file. Times are expressed in seconds from 00:00:00 GMT, Jan. 1, 1970.
type interval_timer= Unix.interval_timer=The three kinds of interval timers.
val sexp_of_interval_timer : interval_timer -> Ppx_sexp_conv_lib.Sexp.tval interval_timer_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> interval_timer
type interval_timer_status= Unix.interval_timer_status={it_interval : float;Period
it_value : float;Current value of the timer
}The type describing the status of an interval timer
val sexp_of_interval_timer_status : interval_timer_status -> Ppx_sexp_conv_lib.Sexp.tval interval_timer_status_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> interval_timer_status
val getitimer : interval_timer -> interval_timer_statusReturn the current status of the given interval timer.
val setitimer : interval_timer -> interval_timer_status -> interval_timer_statussetitimer t ssets the interval timertand returns its previous status. Thesargument is interpreted as follows:s.it_value, if nonzero, is the time to the next timer expiration;s.it_interval, if nonzero, specifies a value to be used in reloading it_value when the timer expires. Settings.it_valueto zero disable the timer. Settings.it_intervalto zero causes the timer to be disabled after its next expiration.
User id, group id
It's highly recommended to read the straight unix docs on these functions for more color. You can get that info from man pages or http://www.opengroup.org/onlinepubs/000095399/functions/setuid.html
val setuid : int -> unitSets the real user id and effective user id for the process. Only use this when superuser. To setuid as an ordinary user, see Core_extended.Unix.seteuid.
module Passwd : sig ... endStructure of entries in the
passwddatabase
module Group : sig ... endStructure of entries in the
groupsdatabase.
module Protocol_family : sig ... endInternet addresses
module Inet_addr : sig ... endmodule Cidr : sig ... endA representation of CIDR netmasks (e.g. "192.168.0.0/24") and functions to match if a given address is inside the range or not. Only IPv4 addresses are supported. Values are always normalized so the base address is the lowest IP address in the range, so for example
to_string (of_string "192.168.1.101/24") = "192.168.1.0/24".
Sockets
type socket_domain= Unix.socket_domain=|PF_UNIXUnix domain
|PF_INETInternet domain
|PF_INET6Internet domain (IPv6)
The type of socket domains.
val sexp_of_socket_domain : socket_domain -> Ppx_sexp_conv_lib.Sexp.tval socket_domain_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> socket_domainval bin_shape_socket_domain : Bin_prot.Shape.tval bin_size_socket_domain : socket_domain Bin_prot.Size.sizerval bin_write_socket_domain : socket_domain Bin_prot.Write.writerval bin_writer_socket_domain : socket_domain Bin_prot.Type_class.writerval bin_read_socket_domain : socket_domain Bin_prot.Read.readerval __bin_read_socket_domain__ : (int -> socket_domain) Bin_prot.Read.readerval bin_reader_socket_domain : socket_domain Bin_prot.Type_class.readerval bin_socket_domain : socket_domain Bin_prot.Type_class.t
type socket_type= Unix.socket_type=|SOCK_STREAMStream socket
|SOCK_DGRAMDatagram socket
|SOCK_RAWRaw socket
|SOCK_SEQPACKETSequenced packets socket
The type of socket kinds, specifying the semantics of communications.
val sexp_of_socket_type : socket_type -> Ppx_sexp_conv_lib.Sexp.tval socket_type_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> socket_typeval bin_shape_socket_type : Bin_prot.Shape.tval bin_size_socket_type : socket_type Bin_prot.Size.sizerval bin_write_socket_type : socket_type Bin_prot.Write.writerval bin_writer_socket_type : socket_type Bin_prot.Type_class.writerval bin_read_socket_type : socket_type Bin_prot.Read.readerval __bin_read_socket_type__ : (int -> socket_type) Bin_prot.Read.readerval bin_reader_socket_type : socket_type Bin_prot.Type_class.readerval bin_socket_type : socket_type Bin_prot.Type_class.t
type sockaddr= Unix.sockaddr=|ADDR_UNIX of string|ADDR_INET of Inet_addr.t * intThe type of socket addresses.
ADDR_UNIX nameis a socket address in the Unix domain;nameis a file name in the file system.ADDR_INET(addr,port)is a socket address in the Internet domain;addris the Internet address of the machine, andportis the port number.
val bin_shape_sockaddr : Bin_prot.Shape.tval bin_size_sockaddr : sockaddr Bin_prot.Size.sizerval bin_write_sockaddr : sockaddr Bin_prot.Write.writerval bin_writer_sockaddr : sockaddr Bin_prot.Type_class.writerval bin_read_sockaddr : sockaddr Bin_prot.Read.readerval __bin_read_sockaddr__ : (int -> sockaddr) Bin_prot.Read.readerval bin_reader_sockaddr : sockaddr Bin_prot.Type_class.readerval bin_sockaddr : sockaddr Bin_prot.Type_class.tval compare_sockaddr : sockaddr -> sockaddr -> intval sexp_of_sockaddr : sockaddr -> Ppx_sexp_conv_lib.Sexp.t
val sockaddr_of_sexp : Core__.Import.Sexp.t -> sockaddr
type sockaddr_blocking_sexp= sockaddrsockaddr_blocking_sexpis likesockaddr, withof_sexpthat performs DNS lookup to resolveInet_addr.t.
val bin_shape_sockaddr_blocking_sexp : Bin_prot.Shape.tval bin_size_sockaddr_blocking_sexp : sockaddr_blocking_sexp Bin_prot.Size.sizerval bin_write_sockaddr_blocking_sexp : sockaddr_blocking_sexp Bin_prot.Write.writerval bin_writer_sockaddr_blocking_sexp : sockaddr_blocking_sexp Bin_prot.Type_class.writerval bin_read_sockaddr_blocking_sexp : sockaddr_blocking_sexp Bin_prot.Read.readerval __bin_read_sockaddr_blocking_sexp__ : (int -> sockaddr_blocking_sexp) Bin_prot.Read.readerval bin_reader_sockaddr_blocking_sexp : sockaddr_blocking_sexp Bin_prot.Type_class.readerval bin_sockaddr_blocking_sexp : sockaddr_blocking_sexp Bin_prot.Type_class.tval sexp_of_sockaddr_blocking_sexp : sockaddr_blocking_sexp -> Ppx_sexp_conv_lib.Sexp.tval sockaddr_blocking_sexp_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> sockaddr_blocking_sexp
val domain_of_sockaddr : sockaddr -> socket_domainReturn the socket domain adequate for the given socket address.
val socket : domain:socket_domain -> kind:socket_type -> protocol:int -> File_descr.tCreate a new socket in the given domain, and with the given kind. The third argument is the protocol type; 0 selects the default protocol for that kind of sockets.
val socketpair : domain:socket_domain -> kind:socket_type -> protocol:int -> File_descr.t * File_descr.tCreate a pair of unnamed sockets, connected together.
val accept : File_descr.t -> File_descr.t * sockaddrAccept connections on the given socket. The returned descriptor is a socket connected to the client; the returned address is the address of the connecting client.
val bind : File_descr.t -> addr:sockaddr -> unitBind a socket to an address.
val connect : File_descr.t -> addr:sockaddr -> unitConnect a socket to an address.
val listen : File_descr.t -> backlog:int -> unitSet up a socket for receiving connection requests. The integer argument is the number of pending requests that will be established and queued for
accept. Depending on operating system, version, and configuration, subsequent connections may be refused actively (as withRST), ignored, or effectively established and queued anyway.Because handling of excess connections varies, it is most robust for applications to accept and close excess connections if they can. To be sure the client receives an
RSTrather than an orderly shutdown, you cansetsockopt_optint file_descr SO_LINGER (Some 0)before closing.In Linux, for example, the system configuration parameters
tcp_max_syn_backlog,tcp_abort_on_overflow, andsyncookiescan all affect connection queuing behavior.
type shutdown_command= Unix.shutdown_command=|SHUTDOWN_RECEIVEClose for receiving
|SHUTDOWN_SENDClose for sending
|SHUTDOWN_ALLClose both
The type of commands for
shutdown.
val sexp_of_shutdown_command : shutdown_command -> Ppx_sexp_conv_lib.Sexp.tval shutdown_command_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> shutdown_command
val shutdown : File_descr.t -> mode:shutdown_command -> unitShutdown a socket connection.
SHUTDOWN_SENDas second argument causes reads on the other end of the connection to return an end-of-file condition.SHUTDOWN_RECEIVEcauses writes on the other end of the connection to return a closed pipe condition (SIGPIPEsignal).
val getsockname : File_descr.t -> sockaddrReturn the address of the given socket.
val getpeername : File_descr.t -> sockaddrReturn the address of the host connected to the given socket.
type msg_flag= Unix.msg_flag=|MSG_OOB|MSG_DONTROUTE|MSG_PEEKThe flags for
UnixLabels.recv,UnixLabels.recvfrom,UnixLabels.send andUnixLabels.sendto.
val sexp_of_msg_flag : msg_flag -> Ppx_sexp_conv_lib.Sexp.tval msg_flag_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> msg_flag
val recv : File_descr.t -> buf:Core__.Import.Bytes.t -> pos:int -> len:int -> mode:msg_flag list -> intReceive data from a connected socket.
val recvfrom : File_descr.t -> buf:Core__.Import.Bytes.t -> pos:int -> len:int -> mode:msg_flag list -> int * sockaddrReceive data from an unconnected socket.
val send : File_descr.t -> buf:Core__.Import.Bytes.t -> pos:int -> len:int -> mode:msg_flag list -> intSend data over a connected socket.
val send_substring : File_descr.t -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> intSame as
sendbut with a string buffer.
val sendto : File_descr.t -> buf:Core__.Import.Bytes.t -> pos:int -> len:int -> mode:msg_flag list -> addr:sockaddr -> intSend data over an unconnected socket.
val sendto_substring : File_descr.t -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> addr:sockaddr -> intSame as
sendtobut with a string buffer.
Socket options
type socket_bool_option=The socket options that can be consulted with
UnixLabels.getsockopt and modified withUnixLabels.setsockopt. These options have a boolean (true/false) value.
val sexp_of_socket_bool_option : socket_bool_option -> Ppx_sexp_conv_lib.Sexp.tval socket_bool_option_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> socket_bool_option
type socket_int_option=The socket options that can be consulted with
UnixLabels.getsockopt_int and modified withUnixLabels.setsockopt_int. These options have an integer value.
val sexp_of_socket_int_option : socket_int_option -> Ppx_sexp_conv_lib.Sexp.tval socket_int_option_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> socket_int_option
type socket_optint_option=|SO_LINGERWhether to linger on closed connections with sexp that have data present, and for how long (in seconds)
The socket options that can be consulted with
UnixLabels.getsockopt_optint and modified withUnixLabels.setsockopt_optint. These options have a value of typeint option, withNonemeaning ``disabled''.
type socket_float_option=|SO_RCVTIMEOTimeout for input operations
|SO_SNDTIMEOTimeout for output operations
The socket options that can be consulted with
UnixLabels.getsockopt_float and modified withUnixLabels.setsockopt_float. These options have a floating-point value representing a time in seconds. The value 0 means infinite timeout.
val sexp_of_socket_float_option : socket_float_option -> Ppx_sexp_conv_lib.Sexp.tval socket_float_option_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> socket_float_option
val getsockopt : File_descr.t -> socket_bool_option -> boolReturn the current status of a boolean-valued option in the given socket.
val setsockopt : File_descr.t -> socket_bool_option -> bool -> unitSet or clear a boolean-valued option in the given socket.
val getsockopt_int : File_descr.t -> socket_int_option -> intSame as
UnixLabels.getsockopt for an integer-valued socket option.
val setsockopt_int : File_descr.t -> socket_int_option -> int -> unitSame as
UnixLabels.setsockopt for an integer-valued socket option.
val getsockopt_optint : File_descr.t -> socket_optint_option -> int optionSame as
UnixLabels.getsockopt for a socket option whose value is anint option.
val setsockopt_optint : File_descr.t -> socket_optint_option -> int option -> unitSame as
UnixLabels.setsockopt for a socket option whose value is anint option.
val getsockopt_float : File_descr.t -> socket_float_option -> floatSame as
UnixLabels.getsockopt for a socket option whose value is a floating-point number.
val setsockopt_float : File_descr.t -> socket_float_option -> float -> unitSame as
UnixLabels.setsockopt for a socket option whose value is a floating-point number.
High-level network connection functions
val open_connection : sockaddr -> Core__.Import.In_channel.t * Core__.Import.Out_channel.tConnect to a server at the given address. Return a pair of buffered channels connected to the server. Remember to call
Caml.flush on the output channel at the right times to ensure correct synchronization.
val shutdown_connection : Core__.Import.In_channel.t -> unit``Shut down'' a connection established with
UnixLabels.open_connection; that is, transmit an end-of-file condition to the server reading on the other side of the connection.
val establish_server : (Core__.Import.In_channel.t -> Core__.Import.Out_channel.t -> unit) -> addr:sockaddr -> unitEstablish a server on the given address. The function given as first argument is called for each connection with two buffered channels connected to the client. A new process is created for each connection. The function
UnixLabels.establish_server never returns normally.
Host and protocol databases
module Host : sig ... endmodule Protocol : sig ... endmodule Service : sig ... endtype addr_info={ai_family : socket_domain;Socket domain
ai_socktype : socket_type;Socket type
ai_protocol : int;Socket protocol number
ai_addr : sockaddr;Address
ai_canonname : string;Canonical host name
}Address information returned by
Unix.getaddrinfo.
val sexp_of_addr_info : addr_info -> Ppx_sexp_conv_lib.Sexp.t
type addr_info_blocking_sexp= addr_infoaddr_info_blocking_sexpis likeaddr_info, withof_sexpthat performs DNS lookup to resolveInet_addr.t.
val sexp_of_addr_info_blocking_sexp : addr_info_blocking_sexp -> Ppx_sexp_conv_lib.Sexp.tval addr_info_blocking_sexp_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> addr_info_blocking_sexp
type getaddrinfo_option=|AI_FAMILY of socket_domainImpose the given socket domain
|AI_SOCKTYPE of socket_typeImpose the given socket type
|AI_PROTOCOL of intImpose the given protocol
|AI_NUMERICHOSTDo not call name resolver, expect numeric IP address
|AI_CANONNAMEFill the
ai_canonnamefield of the result|AI_PASSIVESet address to ``any'' address for use with
Unix.bindOptions to
Unix.getaddrinfo.
val sexp_of_getaddrinfo_option : getaddrinfo_option -> Ppx_sexp_conv_lib.Sexp.tval getaddrinfo_option_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> getaddrinfo_option
val getaddrinfo : string -> string -> getaddrinfo_option list -> addr_info listgetaddrinfo host service optsreturns a list ofUnix.addr_info records describing socket parameters and addresses suitable for communicating with the given host and service. The empty list is returned if the host or service names are unknown, or the constraints expressed inoptscannot be satisfied.hostis either a host name or the string representation of an IP address.hostcan be given as the empty string; in this case, the ``any'' address or the ``loopback'' address are used, depending whetheroptscontainsAI_PASSIVE.serviceis either a service name or the string representation of a port number.servicecan be given as the empty string; in this case, the port field of the returned addresses is set to 0.optsis a possibly empty list of options that allows the caller to force a particular socket domain (e.g. IPv6 only, or IPv4 only) or a particular socket type (e.g. TCP only or UDP only).
type name_info={ni_hostname : string;Name or IP address of host
ni_service : string;Name of service or port number
}Host and service information returned by
Unix.getnameinfo.
val sexp_of_name_info : name_info -> Ppx_sexp_conv_lib.Sexp.tval name_info_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> name_info
type getnameinfo_option=Options to
Unix.getnameinfo.
val sexp_of_getnameinfo_option : getnameinfo_option -> Ppx_sexp_conv_lib.Sexp.tval getnameinfo_option_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> getnameinfo_option
val getnameinfo : sockaddr -> getnameinfo_option list -> name_infogetnameinfo addr optsreturns the host name and service name corresponding to the socket addressaddr.optsis a possibly empty list of options that governs how these names are obtained. RaiseCaml.Not_foundorNot_found_sif an error occurs.
Terminal interface
module Terminal_io : sig ... endval get_sockaddr : string -> int -> sockaddrGet a sockaddr from a hostname or IP, and a port
val set_in_channel_timeout : Core__.Import.In_channel.t -> float -> unitSet a timeout for a socket associated with an
In_channel.t
val set_out_channel_timeout : Core__.Import.Out_channel.t -> float -> unitSet a timeout for a socket associated with an
Out_channel.t
Filesystem functions
val mknod : ?file_kind:file_kind -> ?perm:int -> ?major:int -> ?minor:int -> string -> unitmknod ?file_kind ?perm ?major ?minor pathcreates a filesystem entry. Note that only FIFO-entries are guaranteed to be supported across all platforms as required by the POSIX-standard. On Linux directories and symbolic links cannot be created with this function. UseUnix.mkdir andUnix.symlink instead there respectively.- raises Invalid_argument
if an unsupported file kind is used.
- raises Unix_error
if the system call fails.
- parameter file_kind
default =
S_REG(= regular file)
- parameter perm
default =
0o600(= read/write for user only)
- parameter major
default =
0
- parameter minor
default =
0
I/O vectors
module IOVec : sig ... endI/O-vectors for scatter/gather-operations
I/O functions
val dirfd : dir_handle -> File_descr.t
val fsync : File_descr.t -> unitval fdatasync : File_descr.t -> unitSynchronize the kernel buffers of a given file descriptor with disk, but do not necessarily write file attributes.
val readdir_ino_opt : dir_handle -> (string * nativeint) optionreaddir_ino_opt dhreturn the next entry in a directory (((filename, inode)). ReturnsNonewhen the end of the directory has been reached.
val readdir_ino : dir_handle -> string * nativeintSame as
readdir_ino_optexcept that it signals the end of the directory by raisingEnd_of_file.
val read_assume_fd_is_nonblocking : File_descr.t -> ?pos:int -> ?len:int -> Core__.Import.Bytes.t -> intread_assume_fd_is_nonblocking fd ?pos ?len bufcalls the system callreadASSUMING THAT IT IS NOT GOING TO BLOCK. Reads at mostlenbytes into bufferbufstarting at positionpos.- returns
the number of bytes actually read.
- raises Invalid_argument
if buffer range out of bounds.
- raises Unix_error
on Unix-errors.
- parameter pos
= 0
- parameter len
=
String.length buf - pos
val write_assume_fd_is_nonblocking : File_descr.t -> ?pos:int -> ?len:int -> Core__.Import.Bytes.t -> intwrite_assume_fd_is_nonblocking fd ?pos ?len bufcalls the system callwriteASSUMING THAT IT IS NOT GOING TO BLOCK. Writes at mostlenbytes from bufferbufstarting at positionpos.- returns
the number of bytes actually written.
- raises Invalid_argument
if buffer range out of bounds.
- raises Unix_error
on Unix-errors.
- parameter pos
= 0
- parameter len
=
String.length buf - pos
val writev_assume_fd_is_nonblocking : File_descr.t -> ?count:int -> string IOVec.t array -> intwritev_assume_fd_is_nonblocking fd ?count iovecscalls the system callwritevASSUMING THAT IT IS NOT GOING TO BLOCK usingcountI/O-vectorsiovecs.- returns
the number of bytes actually written.
- raises Invalid_argument
if the designated ranges are invalid.
- raises Unix_error
on Unix-errors.
val writev : File_descr.t -> ?count:int -> string IOVec.t array -> intwritev fd ?count iovecslikewritev_assume_fd_is_nonblocking, but does not require the descriptor to not block. If you feel you have to use this function, you should probably have chosen I/O-vectors that build on bigstrings, because this function has to internally blit the I/O-vectors (ordinary OCaml strings) to intermediate buffers on the C-heap.- returns
the number of bytes actually written.
- raises Invalid_argument
if the designated ranges are invalid.
- raises Unix_error
on Unix-errors.
val pselect : File_descr.t list -> File_descr.t list -> File_descr.t list -> float -> int list -> File_descr.t list * File_descr.t list * File_descr.t listpselect rfds wfds efds timeout sigmasklikeCore_unix.select but also allows one to wait for the arrival of signals.
module RLimit : sig ... end
module Resource_usage : sig ... end
type sysconf=|ARG_MAX|CHILD_MAX|HOST_NAME_MAX|LOGIN_NAME_MAX|OPEN_MAX|PAGESIZE|RE_DUP_MAX|STREAM_MAX|SYMLOOP_MAX|TTY_NAME_MAX|TZNAME_MAX|POSIX_VERSION|PHYS_PAGES|AVPHYS_PAGES|IOV_MAX|CLK_TCKSystem configuration
See 'man sysconf' for documentation.
val sexp_of_sysconf : sysconf -> Ppx_sexp_conv_lib.Sexp.tval sysconf_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> sysconf
val sysconf : sysconf -> int64 optionWrapper over
sysconffunction in C.
val sysconf_exn : sysconf -> int64
Temporary file and directory creation
val mkstemp : string -> string * File_descr.tmkstemp prefixcreates and opens a unique temporary file withprefix, automatically appending a suffix of.tmp.followed by six random characters to make the name unique. Unlike C'smkstemp,prefixshould not include six X's at the end.The file descriptor will have close-on-exec flag set if O_CLOEXEC flag is supported.
- raises Unix_error
on errors.
Signal handling
User id, group id
Globbing and shell expansion
val fnmatch : ?flags:[ `No_escape | `Pathname | `Period | `File_name | `Leading_dir | `Casefold ] list -> pat:string -> string -> boolno system calls involved
val wordexp : (?flags:[ `No_cmd | `Show_err | `Undef ] list -> string -> string array) Core__.Import.Or_error.tSee man page for wordexp.
System information
module Utsname : sig ... endval uname : unit -> Utsname.tSee man page for uname.
Additional IP functionality
val if_indextoname : int -> stringif_indextoname ifindexIfifindexis an interface index, then the function returns the interface name. Otherwise, it raisesUnix_error.
val mcast_join : ?ifname:string -> ?source:Inet_addr.t -> File_descr.t -> sockaddr -> unitmcast_join ?ifname ?source sock addrjoin a multicast group ataddrwith socketsock, from source atsourceif specified, optionally using network interfaceifname.- parameter ifname
default = any interface
val mcast_leave : ?ifname:string -> ?source:Inet_addr.t -> File_descr.t -> sockaddr -> unitmcast_leave ?ifname ?source sock addrleaves a multicast group ataddrwith socketsock, from source atsourceif specified, optionally using network interfaceifname.- parameter ifname
default = any interface
val get_mcast_ttl : File_descr.t -> intget_mcast_ttl sockreads the time-to-live value of outgoing multicast packets for socketsock.
val set_mcast_ttl : File_descr.t -> int -> unitset_mcast_ttl sock ttlsets the time-to-live value of outgoing multicast packets for socketsocktottl.
val get_mcast_loop : File_descr.t -> boolget_mcast_loop sockreads the boolean argument that determines whether sent multicast packets are looped back to local sockets.
val set_mcast_loop : File_descr.t -> bool -> unitset_mcast_loop sock loopsets the boolean argument that determines whether sent multicast packets are looped back to local sockets.
val set_mcast_ifname : File_descr.t -> string -> unitset_mcast_ifname sock "eth0"sets outgoing multicast traffic on IPv4 UDP socketsockto go out through interfaceeth0.This uses
setsockoptwithIP_MULTICAST_IFand applies to multicast traffic. For non-multicast applications, seeLinux_ext.bind_to_interface.
module Scheduler : sig ... endmodule Priority : sig ... endmodule Mman : sig ... endFor keeping your memory in RAM, i.e. preventing it from being swapped out.
module Ifaddr : sig ... endA network interface on the local machine. See
man getifaddrs.
val getifaddrs : unit -> Ifaddr.t list
module Stable : sig ... end