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 ... end
File descriptor.
type error = UnixLabels.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 int
val sexp_of_error : UnixLabels.error -> Core.Sexp.t
val error_of_sexp : Core.Sexp.t -> UnixLabels.error
module Error : sig ... end
exception Unix_error of Error.t * string * string
Raised 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 Syscall_result with type 'a t = 'a Syscall_result.t
Representation of Unix system call results
val error_message : Error.t -> string
handle_unix_error f
runs f ()
and returns the result. If the exception Unix_error
is raised, it prints a message describing the error and exits with code 2.
retry_until_no_eintr f
returns f ()
unless f ()
fails with EINTR
; in which case f ()
is run again until it raises a different error or returns a value.
module Private : sig ... end
If you're looking for getenv
, that's in the Sys module.
Return the process environment, as an array of strings with the format ``variable=value''. The returned array is empty if the process has special privileges.
Unix.putenv ~key ~data
sets the value associated to a variable in the process environment. key
is the name of the environment variable, and data
its new associated value.
unsetenv name
deletes the variable name
from the environment.
EINVAL name
contained an ’=’ or an '\000' character.
module Exit : sig ... end
The termination status of a process.
module Exit_or_signal : sig ... end
module Exit_or_signal_or_stop : sig ... end
module Env : sig ... end
type env = Env.t
val sexp_of_env : env -> Sexplib0.Sexp.t
val env_of_sexp : Sexplib0.Sexp.t -> env
module Pgid : sig ... end
this module mirrors Spawn.Pgid
val exec :
prog:string ->
argv:string list ->
?use_path:bool ->
?env:env ->
unit ->
Core.never_returns
exec ~prog ~argv ?search_path ?env
execs prog
with argv
. If use_path = true
(the default) and prog
doesn't contain a slash, then exec
searches the PATH
environment variable for prog
. If env
is supplied, it determines the environment when prog
is executed.
While not strictly necessary, by convention, the first element in argv
should be the name of the file being executed, e.g.:
exec ~prog ~argv:[ prog; arg1; arg2; ...] ()
val fork_exec :
prog:string ->
argv:string list ->
?preexec_fn:(unit -> unit) ->
?use_path:bool ->
?env:env ->
unit ->
Core.Pid.t
fork_exec ~prog ~argv ?preexec_fn ?use_path ?env ()
forks, calls preexec_fn
, and then execs prog
with argv
in the child process, returning the child PID to the parent. As in exec
, by convention, the 0th element in argv
should be the program itself.
Since preexec_fn
is invoked post-fork but pre-exec, it must:
Violating these constraints may cause the program to deadlock or exhibit undefined behavior.
val fork : unit -> [ `In_the_child | `In_the_parent of Core.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.
wait{,_nohang,_untraced,_nohang_untraced} ?restart wait_on
is a family of functions that wait on a process to exit (normally or via a signal) or be stopped by a signal (if untraced
is used). The wait_on
argument specifies which processes to wait on. The nohang
variants return None
immediately if none of the desired processes has exited yet. If nohang
is not used, waitpid
will block until one of the desired processes exits.
The non-nohang variants have a restart
flag with (default true) that causes the system call to be retried upon EAGAIN|EINTR. The nohang variants do not have this flag because they don't block.
val sexp_of_wait_on : wait_on -> Sexplib0.Sexp.t
val wait_on_of_sexp : Sexplib0.Sexp.t -> wait_on
val __wait_on_of_sexp__ : Sexplib0.Sexp.t -> wait_on
val wait : ?restart:bool -> wait_on -> Core.Pid.t * Exit_or_signal.t
val wait_nohang : wait_on -> (Core.Pid.t * Exit_or_signal.t) option
val wait_untraced :
?restart:bool ->
wait_on ->
Core.Pid.t * Exit_or_signal_or_stop.t
val wait_nohang_untraced :
wait_on ->
(Core.Pid.t * Exit_or_signal_or_stop.t) option
val waitpid : Core.Pid.t -> Exit_or_signal.t
waitpid pid
waits for child process pid
to terminate, and returns its exit status. waitpid_exn
is like waitpid
, 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.Pid.t -> unit
val system : string -> Exit_or_signal.t
Execute the given command, wait until it terminates, and return its termination status. The string is interpreted by the shell /bin/sh
and therefore can contain redirections, quotes, variables, etc. The result WEXITED 127
indicates that the shell couldn't be executed.
val getpid : unit -> Core.Pid.t
Return the pid of the process.
val getppid : unit -> Core.Pid.t option
Return the pid of the parent process.
val getppid_exn : unit -> Core.Pid.t
Return the pid of the parent process, if you're really sure you're never going to be the init process.
val setpgid : of_:Core.Pid.t -> to_:Core.Pid.t -> unit
Set process group ID of a process.
val getpgid : Core.Pid.t -> Core.Pid.t option
Return process group ID of a process.
None
means the pgid is zero, which cannot be represented as a Pid.t
. This happens at least for kernel processes. See ps -ejH
for examples.
module Thread_id : sig ... end
val gettid : (unit -> Thread_id.t) Core.Or_error.t
Get the numeric ID of the current thread, e.g. for identifying it in top(1).
Change the process priority. The integer argument is added to the ``nice'' value. (Higher values of the ``nice'' value mean lower priorities.) Return the new nice value.
The abstract type of file descriptors.
val stdin : File_descr.t
File descriptor for standard input.
val stdout : File_descr.t
File descriptor for standard output.
val stderr : File_descr.t
File descriptor for standard standard error.
The flags to UnixLabels.openfile
.
type open_flag = UnixLabels.open_flag =
| O_RDONLY
Open for reading
*)| O_WRONLY
Open for writing
*)| O_RDWR
Open for reading and writing
*)| O_NONBLOCK
Open in non-blocking mode
*)| O_APPEND
Open for append
*)| O_CREAT
Create if nonexistent
*)| O_TRUNC
Truncate to 0 length if existing
*)| O_EXCL
Fail if existing
*)| O_NOCTTY
Don't make this dev a controlling tty
*)| O_DSYNC
Writes complete as `Synchronised I/O data integrity completion'
*)| O_SYNC
Writes complete as `Synchronised I/O file integrity completion'
*)| O_RSYNC
Reads complete as writes (depending on O_SYNC/O_DSYNC)
*)| O_SHARE_DELETE
Windows only: allow the file to be deleted while still open
*)| O_CLOEXEC
| O_KEEPEXEC
val open_flag_of_sexp : Core.Sexp.t -> open_flag
We can't use with sexp
because pa_sexp inserts two copies of the val
specs, which leads to a spurious "unused" warning.
val sexp_of_open_flag : open_flag -> Core.Sexp.t
val sexp_of_file_perm : file_perm -> Sexplib0.Sexp.t
val file_perm_of_sexp : Sexplib0.Sexp.t -> file_perm
val openfile : ?perm:file_perm -> mode:open_flag list -> string -> File_descr.t
Open 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 ... end
val fcntl_getfl : File_descr.t -> Open_flags.t
fcntl_getfl fd
gets the current flags for fd
from the open-file-descriptor table via the system call fcntl(fd, F_GETFL)
. See "man fcntl".
val fcntl_setfl : File_descr.t -> Open_flags.t -> unit
fcntl_setfl fd flags
sets the flags for fd
in the open-file-descriptor table via the system call fcntl(fd, F_SETFL, flags)
. See "man fcntl". As per the Linux man page, on Linux this only allows append
, async
, direct
, noatime
, and nonblock
to be set.
val close : ?restart:bool -> File_descr.t -> unit
Close a file descriptor.
val with_file :
?perm:file_perm ->
string ->
mode:open_flag list ->
f:(File_descr.t -> 'a) ->
'a
with_file file ~mode ~perm ~f
opens file
, and applies f
to the resulting file descriptor. When f
finishes (or raises), with_file
closes the descriptor and returns the result of f
(or raises).
val read :
?restart:bool ->
?pos:int ->
?len:int ->
File_descr.t ->
buf:Core.Bytes.t ->
int
read ~pos ~len fd ~buf
reads len
bytes from descriptor fd
, storing them in byte sequence buf
, starting at position pos
in buf
. Return the number of bytes actually read.
val write : ?pos:int -> ?len:int -> File_descr.t -> buf:Core.Bytes.t -> int
write ~pos ~len fd ~buf
writes len
bytes to descriptor fd
, taking them from byte sequence buf
, starting at position pos
in buff
. Return the number of bytes actually written.
When an error is reported some characters might have already been written. Use single_write
instead 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 -> int
Same as write
but with a string buffer.
val single_write :
?restart:bool ->
?pos:int ->
?len:int ->
File_descr.t ->
buf:Core.Bytes.t ->
int
Same as write
but 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 ->
int
Same as single_write
but with a string buffer.
val in_channel_of_descr : File_descr.t -> Core.In_channel.t
Create an input channel reading from the given descriptor. The channel is initially in binary mode; use set_binary_mode_in ic false
if text mode is desired.
val out_channel_of_descr : File_descr.t -> Core.Out_channel.t
Create an output channel writing on the given descriptor. The channel is initially in binary mode; use set_binary_mode_out oc false
if text mode is desired.
val descr_of_in_channel : Core.In_channel.t -> File_descr.t
Return the descriptor corresponding to an input channel.
val descr_of_out_channel : Core.Out_channel.t -> File_descr.t
Return the descriptor corresponding to an output channel.
type seek_command = UnixLabels.seek_command =
POSITIONING modes for UnixLabels.lseek
.
val sexp_of_seek_command : seek_command -> Sexplib0.Sexp.t
val seek_command_of_sexp : Sexplib0.Sexp.t -> seek_command
val lseek : File_descr.t -> int64 -> mode:seek_command -> int64
Set the current position for a file descriptor
val ftruncate : File_descr.t -> len:int64 -> unit
Truncates the file corresponding to the given descriptor to the given size.
type file_kind = UnixLabels.file_kind =
val sexp_of_file_kind : file_kind -> Sexplib0.Sexp.t
val file_kind_of_sexp : Sexplib0.Sexp.t -> file_kind
type stats = UnixLabels.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 are float
number of seconds since the epoch; we don't use Time.t
because Time
depends on Unix
, so the fix isn't so trivial. Same for Native_file.stats
below.
val sexp_of_stats : stats -> Sexplib0.Sexp.t
val stats_of_sexp : Sexplib0.Sexp.t -> stats
val stat : string -> stats
Return the information for the named file.
val lstat : string -> stats
Same as UnixLabels.stat
, but in case the file is a symbolic link, return the information for the link itself.
val fstat : File_descr.t -> stats
Return the information for the file associated with the given descriptor.
module Native_file : sig ... end
This 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
type lock_command = UnixLabels.lock_command =
| F_ULOCK
Unlock a region
*)| F_LOCK
Lock a region for writing, and block if already locked
*)| F_TLOCK
Lock a region for writing, or fail if already locked
*)| F_TEST
Test a region for other process locks
*)| F_RLOCK
Lock a region for reading, and block if already locked
*)| F_TRLOCK
Lock a region for reading, or fail if already locked
*)Commands for lockf
.
val sexp_of_lock_command : lock_command -> Sexplib0.Sexp.t
val lock_command_of_sexp : Sexplib0.Sexp.t -> lock_command
val lockf : File_descr.t -> mode:lock_command -> len:Core.Int64.t -> unit
lockf fd cmd size
place 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.
Note that, despite the name, this function does not call the UNIX lockf() system call; rather it calls fcntl() with one of F_SETLK, F_SETLKW, or F_GETLK.
module Flock_command : sig ... end
val flock : File_descr.t -> Flock_command.t -> bool
flock fd cmd
places or releases a lock on the fd as per the flock C call of the same name. The request is "nonblocking" (LOCK_NB in C), meaning that if the lock cannot be granted immediately, the return value is false. However, the system call still blocks until the lock status can be ascertained. true
is returned if the lock was granted.
val flock_blocking : File_descr.t -> Flock_command.t -> unit
flock_blocking fd cmd
places or releases a lock on the fd as per the flock C call. The function does not return until a lock can be granted.
val isatty : File_descr.t -> bool
Return true
if the given file descriptor refers to a terminal or console window, false
otherwise.
val map_file :
File_descr.t ->
?pos:int64 ->
('a, 'b) Bigarray.kind ->
'c Bigarray.layout ->
shared:bool ->
int array ->
('a, 'b, 'c) Bigarray.Genarray.t
Memory mapping of a file as a big array. map_file fd kind layout ~shared dims
returns a big array of kind kind
, layout layout
, and dimensions as specified in dims
.
The data contained in this big array are the contents of the file referred to by the file descriptor fd
.
The optional pos
parameter is the byte offset in the file of the data being mapped. It defaults to 0.
If shared
is true
, all modifications performed on the array are reflected in the file. This requires that fd
be opened with write permissions. If shared
is false
, 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_file
then 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, otherwise Failure
is 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 on fd
.
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_argument
or Failure
may be raised in cases where argument validation fails.
rename old new
changes the name of a file from old
to new
.
link ?force ~target ~link_name ()
creates a hard link named link_name
to the file named target
. If force
is true, an existing entry in place of link_name
will be unlinked. This unlinking may raise a Unix error, e.g. if the entry is a directory.
val chmod : string -> perm:file_perm -> unit
Change the permissions of the named file.
val fchmod : File_descr.t -> perm:file_perm -> unit
Change the permissions of an opened file.
Change the owner uid and owner gid of the named file.
val fchown : File_descr.t -> uid:int -> gid:int -> unit
Change the owner uid and owner gid of an opened file.
val access :
string ->
[ `Read | `Write | `Exec | `Exists ] list ->
(unit, exn) Core.Result.t
Check that the process has the given permissions over the named file.
val dup : ?close_on_exec:bool -> File_descr.t -> File_descr.t
Return a new file descriptor referencing the same file as the given descriptor.
val dup2 :
?close_on_exec:bool ->
src:File_descr.t ->
dst:File_descr.t ->
unit ->
unit
dup2 ~src ~dst
duplicates src
to dst
, closing dst
if already opened.
val set_nonblock : File_descr.t -> unit
Set 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 EAGAIN
or EWOULDBLOCK
error instead of blocking; writing on a descriptor on which there is temporarily no room for writing also raises EAGAIN
or EWOULDBLOCK
.
val clear_nonblock : File_descr.t -> unit
Clear the ``non-blocking'' flag on the given descriptor. See UnixLabels.set_nonblock
.
val set_close_on_exec : File_descr.t -> unit
Set 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 exec
functions.
val get_close_on_exec : File_descr.t -> bool
Check whether the ``close-on-exec'' flag is set on the given descriptor.
val clear_close_on_exec : File_descr.t -> unit
Clear the ``close-on-exec'' flag on the given descriptor. See UnixLabels.set_close_on_exec
.
val mkdir : ?perm:file_perm -> string -> unit
Create a directory. The permissions of the created directory are (perm & ~umask & 0777). The default perm is 0777.
val mkdir_p : ?perm:file_perm -> string -> unit
Create a directory recursively. The permissions of the created directory are those granted by mkdir ~perm
.
type dir_handle = UnixLabels.dir_handle
The type of descriptors over opened directories.
val opendir : ?restart:bool -> string -> dir_handle
Open a descriptor on a directory
val readdir_opt : dir_handle -> string option
Return the next entry in a directory. Returns None
when the end of the directory has been reached.
val readdir : dir_handle -> string
Same as readdir_opt
except that it signals the end of the directory by raising End_of_file
.
val rewinddir : dir_handle -> unit
Reposition the descriptor to the beginning of the directory
val closedir : dir_handle -> unit
Close a directory descriptor.
module Readdir_detailed : sig ... end
val readdir_detailed_opt : dir_handle -> Readdir_detailed.t option
readdir_detailed_opt dh
return the next entry in a directory. Returns None
when the end of the directory has been reached.
val ls_dir_detailed : string -> Readdir_detailed.t list
ls_dir_detailed path
returns the information from readdir_detailed_opt
with an interface similar to that of Sys_unix.ls_dir
.
val pipe : ?close_on_exec:bool -> unit -> File_descr.t * File_descr.t
Create 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 -> unit
Create a named pipe with the given permissions.
module Process_info : sig ... end
Low-level process
val create_process : prog:string -> args:string list -> Process_info.t
create_process ~prog ~args
forks a new process that executes the program prog
with arguments args
. The function returns the pid of the process along with file descriptors attached to stdin, stdout, and stderr of the new process. The executable file prog
is searched for in the path. The new process has the same environment as the current process. Unlike in execve
the program name is automatically passed as the first argument.
val create_process_env :
?working_dir:string ->
?prog_search_path:string list ->
?argv0:string ->
?setpgid:Pgid.t ->
prog:string ->
args:string list ->
env:env ->
unit ->
Process_info.t
create_process_env ~prog ~args ~env
as create_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. If argv0
is given, it is used (instead of prog
) as the first element of the argv
array passed to execve
.
The exact program to execute is determined using the usual conventions. More precisely, if prog
contains at least one '/' character then it is used as is (relative to working_dir
if prog
is a relative path, absolute otherwise). Note that working_dir
defaults to the working directory of the current process, i.e. getcwd ()
. If prog
contains no '/' character, then it is looked up in prog_search_path
: for the first dir
in prog_search_path
such that Filename.concat dir prog
exists and is executable, Filename.concat dir prog
is the program that will be executed.
prog_search_path
defaults 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 the env
argument of this function has no effect on how prog
is 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_path
in such scenarios; alternatively, perhaps more satisfactorily, an absolute path should be given as prog
.
module Fd_spec : sig ... end
module Pid_with_generated_fds : sig ... end
val create_process_with_fds :
?working_dir:string ->
?prog_search_path:string list ->
?argv0:string ->
?setpgid:Pgid.t ->
?env:env ->
prog:string ->
args:string list ->
stdin:'stdin Fd_spec.t ->
stdout:'stdout Fd_spec.t ->
stderr:'stderr Fd_spec.t ->
unit ->
('stdin, 'stdout, 'stderr) Pid_with_generated_fds.t
Like create_process_env
, but allowing existing file descriptors for stdn,out,err for the child process, instead of generating fresh ones. create_process_env
is essentially create_process_with_fds
with Generate
passed for all three.
Note that each file descriptor is either passed in via Use_this fd
or returned due to Generate
. Those passed in will be used by the new (child) process, while those returned will be used by this (the parent) process. E.g., a supplied stdin must be readable (by the child), while a returned stdin will be writable (by the parent).
File descriptors passed in via Use_this fd
can be CLOEXEC; they will be dup
ed for the new process.
val open_process_in : string -> Core.In_channel.t
High-level pipe and process management. These functions (with UnixLabels.open_process_out
and UnixLabels.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 call Caml.flush
at the right times to ensure correct synchronization.
val open_process_out : string -> Core.Out_channel.t
val open_process : string -> Core.In_channel.t * Core.Out_channel.t
module Process_channels : sig ... end
Similar 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
close_process_*
raises Unix_error
if, for example, the file descriptor has already been closed.
val close_process_in : Core.In_channel.t -> Exit_or_signal.t
Close channels opened by UnixLabels.open_process_in
, wait for the associated command to terminate, and return its termination status.
val close_process_out : Core.Out_channel.t -> Exit_or_signal.t
Close channels opened by UnixLabels.open_process_out
, wait for the associated command to terminate, and return its termination status.
val close_process :
(Core.In_channel.t * Core.Out_channel.t) ->
Exit_or_signal.t
Close 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.t
Close channels opened by UnixLabels.open_process_full
, wait for the associated command to terminate, and return its termination status.
symlink ~target ~link_name
creates the file link_name
as a symbolic link to the file target
. On Windows, this has the semantics using stat
as described at: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html
module Select_fds : sig ... end
val sexp_of_select_timeout : select_timeout -> Sexplib0.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.t
Wait 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. ~timeout
is 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 select
to restart automatically on EINTR (instead of propagating the exception)...
type process_times = UnixLabels.process_times = {
tms_utime : float;
User time for the process
*)tms_stime : float;
System time for the process
*)tms_cutime : float;
User time for the children processes
*)tms_cstime : float;
System time for the children processes
*)}
The execution times (CPU times) of a process.
val sexp_of_process_times : process_times -> Sexplib0.Sexp.t
val process_times_of_sexp : Sexplib0.Sexp.t -> process_times
module Clock : sig ... end
type tm = UnixLabels.tm = {
tm_sec : int;
Seconds 0..59
*)tm_min : int;
Minutes 0..59
*)tm_hour : int;
Hours 0..23
*)tm_mday : int;
Day of month 1..31
*)tm_mon : int;
Month of year 0..11
*)tm_year : int;
Year - 1900
*)tm_wday : int;
Day of week (Sunday is 0)
*)tm_yday : int;
Day of year 0..365
*)tm_isdst : bool;
Daylight time savings in effect
*)}
The type representing wallclock time and calendar date.
val sexp_of_tm : tm -> Sexplib0.Sexp.t
val tm_of_sexp : Sexplib0.Sexp.t -> tm
Same as time
above, but with resolution better than 1 second.
val gmtime : float -> tm
Convert a time in seconds, as returned by UnixLabels.time
, into a date and a time. Assumes UTC.
val timegm : tm -> float
Convert a UTC time in a tm record to a time in seconds
val localtime : float -> tm
Convert a time in seconds, as returned by UnixLabels.time
, into a date and a time. Assumes the local time zone.
Convert a date and time, specified by the tm
argument, into a time in seconds, as returned by UnixLabels.time
. Also return a normalized copy of the given tm
record, with the tm_wday
, tm_yday
, and tm_isdst
fields recomputed from the other fields. The tm
argument is interpreted in the local time zone.
val strftime : tm -> string -> string
Convert a date and time, specified by the tm
argument, into a formatted string. See 'man strftime' for format options.
val strptime :
?allow_trailing_input:bool ->
fmt:string ->
string ->
UnixLabels.tm
Given a format string, convert a corresponding string to a date and time See 'man strptime' for format options.
Raise if allow_trailing_input
is false and fmt
does not consume all of the input.
nanosleep f
delays execution of the program for at least f
seconds. 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_times
Return the execution times of the process.
Set 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 = UnixLabels.interval_timer =
| ITIMER_REAL
decrements in real time, and sends the signal SIGALRM
when expired.
| ITIMER_VIRTUAL
decrements in process virtual time, and sends SIGVTALRM
when expired.
| ITIMER_PROF
(for profiling) decrements both when the process is running and when the system is running on behalf of the process; it sends SIGPROF
when expired.
The three kinds of interval timers.
val sexp_of_interval_timer : interval_timer -> Sexplib0.Sexp.t
val interval_timer_of_sexp : Sexplib0.Sexp.t -> interval_timer
The type describing the status of an interval timer
val sexp_of_interval_timer_status : interval_timer_status -> Sexplib0.Sexp.t
val interval_timer_status_of_sexp : Sexplib0.Sexp.t -> interval_timer_status
val getitimer : interval_timer -> interval_timer_status
Return the current status of the given interval timer.
val setitimer :
interval_timer ->
interval_timer_status ->
interval_timer_status
setitimer t s
sets the interval timer t
and returns its previous status. The s
argument 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. Setting s.it_value
to zero disable the timer. Setting s.it_interval
to zero causes the timer to be disabled after its next expiration.
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
Sets 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 ... end
Structure of entries in the passwd
database
module Group : sig ... end
Structure of entries in the groups
database.
Return the name of the user executing the process, from the Passwd
module.
Note that this function is not always guaranteed to succeed: depending on OS configuration, computing the current username can involve network queries, which can fail transiently.
module Protocol_family : sig ... end
module Inet_addr : sig ... end
module Cidr : sig ... end
A 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"
.
type socket_domain = UnixLabels.socket_domain =
The type of socket domains.
val sexp_of_socket_domain : socket_domain -> Sexplib0.Sexp.t
val socket_domain_of_sexp : Sexplib0.Sexp.t -> socket_domain
val bin_shape_socket_domain : Core.Bin_prot.Shape.t
val bin_size_socket_domain : socket_domain Core.Bin_prot.Size.sizer
val bin_write_socket_domain : socket_domain Core.Bin_prot.Write.writer
val bin_writer_socket_domain : socket_domain Core.Bin_prot.Type_class.writer
val bin_read_socket_domain : socket_domain Core.Bin_prot.Read.reader
val __bin_read_socket_domain__ :
(int -> socket_domain) Core.Bin_prot.Read.reader
val bin_reader_socket_domain : socket_domain Core.Bin_prot.Type_class.reader
val bin_socket_domain : socket_domain Core.Bin_prot.Type_class.t
type socket_type = UnixLabels.socket_type =
The type of socket kinds, specifying the semantics of communications.
val sexp_of_socket_type : socket_type -> Sexplib0.Sexp.t
val socket_type_of_sexp : Sexplib0.Sexp.t -> socket_type
val bin_shape_socket_type : Core.Bin_prot.Shape.t
val bin_size_socket_type : socket_type Core.Bin_prot.Size.sizer
val bin_write_socket_type : socket_type Core.Bin_prot.Write.writer
val bin_writer_socket_type : socket_type Core.Bin_prot.Type_class.writer
val bin_read_socket_type : socket_type Core.Bin_prot.Read.reader
val __bin_read_socket_type__ : (int -> socket_type) Core.Bin_prot.Read.reader
val bin_reader_socket_type : socket_type Core.Bin_prot.Type_class.reader
val bin_socket_type : socket_type Core.Bin_prot.Type_class.t
The type of socket addresses. ADDR_UNIX name
is a socket address in the Unix domain; name
is a file name in the file system. ADDR_INET(addr,port)
is a socket address in the Internet domain; addr
is the Internet address of the machine, and port
is the port number.
val bin_shape_sockaddr : Core.Bin_prot.Shape.t
val bin_size_sockaddr : sockaddr Core.Bin_prot.Size.sizer
val bin_write_sockaddr : sockaddr Core.Bin_prot.Write.writer
val bin_writer_sockaddr : sockaddr Core.Bin_prot.Type_class.writer
val bin_read_sockaddr : sockaddr Core.Bin_prot.Read.reader
val __bin_read_sockaddr__ : (int -> sockaddr) Core.Bin_prot.Read.reader
val bin_reader_sockaddr : sockaddr Core.Bin_prot.Type_class.reader
val bin_sockaddr : sockaddr Core.Bin_prot.Type_class.t
val sexp_of_sockaddr : sockaddr -> Sexplib0.Sexp.t
val sockaddr_of_sexp : Core.Sexp.t -> sockaddr
type sockaddr_blocking_sexp = sockaddr
sockaddr_blocking_sexp
is like sockaddr
, with of_sexp
that performs DNS lookup to resolve Inet_addr.t
.
val bin_shape_sockaddr_blocking_sexp : Core.Bin_prot.Shape.t
val bin_size_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Size.sizer
val bin_write_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Write.writer
val bin_writer_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Type_class.writer
val bin_read_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Read.reader
val __bin_read_sockaddr_blocking_sexp__ :
(int -> sockaddr_blocking_sexp) Core.Bin_prot.Read.reader
val bin_reader_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Type_class.reader
val bin_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Type_class.t
val sexp_of_sockaddr_blocking_sexp : sockaddr_blocking_sexp -> Sexplib0.Sexp.t
val sockaddr_blocking_sexp_of_sexp : Sexplib0.Sexp.t -> sockaddr_blocking_sexp
val domain_of_sockaddr : sockaddr -> socket_domain
Return the socket domain adequate for the given socket address.
val socket :
?close_on_exec:bool ->
domain:socket_domain ->
kind:socket_type ->
protocol:int ->
unit ->
File_descr.t
Create 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 :
?close_on_exec:bool ->
domain:socket_domain ->
kind:socket_type ->
protocol:int ->
unit ->
File_descr.t * File_descr.t
Create a pair of unnamed sockets, connected together.
val accept : ?close_on_exec:bool -> File_descr.t -> File_descr.t * sockaddr
Accept 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 -> unit
Bind a socket to an address.
val connect : File_descr.t -> addr:sockaddr -> unit
Connect a socket to an address.
val listen : File_descr.t -> backlog:int -> unit
Set 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 with RST
), 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 RST
rather than an orderly shutdown, you can setsockopt_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
, and syncookies
can all affect connection queuing behavior.
type shutdown_command = UnixLabels.shutdown_command =
The type of commands for shutdown
.
val sexp_of_shutdown_command : shutdown_command -> Sexplib0.Sexp.t
val shutdown_command_of_sexp : Sexplib0.Sexp.t -> shutdown_command
val shutdown : File_descr.t -> mode:shutdown_command -> unit
Shutdown a socket connection. SHUTDOWN_SEND
as second argument causes reads on the other end of the connection to return an end-of-file condition. SHUTDOWN_RECEIVE
causes writes on the other end of the connection to return a closed pipe condition (SIGPIPE
signal).
val getsockname : File_descr.t -> sockaddr
Return the address of the given socket.
val getpeername : File_descr.t -> sockaddr
Return the address of the host connected to the given socket.
The flags for UnixLabels.recv
, UnixLabels.recvfrom
, UnixLabels.send
and UnixLabels.sendto
.
val sexp_of_msg_flag : msg_flag -> Sexplib0.Sexp.t
val msg_flag_of_sexp : Sexplib0.Sexp.t -> msg_flag
val recv :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
int
Receive data from a connected socket.
val recvfrom :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
int * sockaddr
Receive data from an unconnected socket.
val send :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
int
Send data over a connected socket.
val send_substring :
File_descr.t ->
buf:string ->
pos:int ->
len:int ->
mode:msg_flag list ->
int
Same as send
but with a string buffer.
val sendto :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
addr:sockaddr ->
int
Send data over an unconnected socket.
val sendto_substring :
File_descr.t ->
buf:string ->
pos:int ->
len:int ->
mode:msg_flag list ->
addr:sockaddr ->
int
Same as sendto
but with a string buffer.
type socket_bool_option =
| SO_DEBUG
Record debugging information
*)| SO_BROADCAST
Permit sending of broadcast messages
*)| SO_REUSEADDR
Allow reuse of local addresses for bind
*)| SO_KEEPALIVE
Keep connection active
*)| SO_DONTROUTE
Bypass the standard routing algorithms
*)| SO_OOBINLINE
Leave out-of-band data in line
*)| SO_ACCEPTCONN
Report whether socket listening is enabled
*)| TCP_NODELAY
Control the Nagle algorithm for TCP sockets
*)| IPV6_ONLY
Forbid binding an IPv6 socket to an IPv4 address
*)| SO_REUSEPORT
The socket options that can be consulted with UnixLabels.getsockopt
and modified with UnixLabels.setsockopt
. These options have a boolean (true
/false
) value.
val sexp_of_socket_bool_option : socket_bool_option -> Sexplib0.Sexp.t
val socket_bool_option_of_sexp : Sexplib0.Sexp.t -> socket_bool_option
type socket_int_option =
| SO_SNDBUF
Size of send buffer
*)| SO_RCVBUF
Size of received buffer
*)| SO_ERROR
Report the error status and clear it
*)| SO_TYPE
Report the socket type
*)| SO_RCVLOWAT
Minimum number of bytes to process for input operations
*)| SO_SNDLOWAT
Minimum number of bytes to process for output operations
*)The socket options that can be consulted with UnixLabels.getsockopt_int
and modified with UnixLabels.setsockopt_int
. These options have an integer value.
val sexp_of_socket_int_option : socket_int_option -> Sexplib0.Sexp.t
val socket_int_option_of_sexp : Sexplib0.Sexp.t -> socket_int_option
The socket options that can be consulted with UnixLabels.getsockopt_optint
and modified with UnixLabels.setsockopt_optint
. These options have a value of type int option
, with None
meaning ``disabled''.
The socket options that can be consulted with UnixLabels.getsockopt_float
and modified with UnixLabels.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 -> Sexplib0.Sexp.t
val socket_float_option_of_sexp : Sexplib0.Sexp.t -> socket_float_option
val getsockopt : File_descr.t -> socket_bool_option -> bool
Return the current status of a boolean-valued option in the given socket.
val setsockopt : File_descr.t -> socket_bool_option -> bool -> unit
Set or clear a boolean-valued option in the given socket.
val getsockopt_int : File_descr.t -> socket_int_option -> int
Same as UnixLabels.getsockopt
for an integer-valued socket option.
val setsockopt_int : File_descr.t -> socket_int_option -> int -> unit
Same as UnixLabels.setsockopt
for an integer-valued socket option.
val getsockopt_optint : File_descr.t -> socket_optint_option -> int option
Same as UnixLabels.getsockopt
for a socket option whose value is an int option
.
val setsockopt_optint :
File_descr.t ->
socket_optint_option ->
int option ->
unit
Same as UnixLabels.setsockopt
for a socket option whose value is an int option
.
val getsockopt_float : File_descr.t -> socket_float_option -> float
Same as UnixLabels.getsockopt
for a socket option whose value is a floating-point number.
val setsockopt_float : File_descr.t -> socket_float_option -> float -> unit
Same as UnixLabels.setsockopt
for a socket option whose value is a floating-point number.
val open_connection : sockaddr -> Core.In_channel.t * Core.Out_channel.t
Connect 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.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.In_channel.t -> Core.Out_channel.t -> unit) ->
addr:sockaddr ->
unit
Establish 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.
module Host : sig ... end
module Protocol : sig ... end
module Service : sig ... end
type 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 -> Sexplib0.Sexp.t
type addr_info_blocking_sexp = addr_info
addr_info_blocking_sexp
is like addr_info
, with of_sexp
that performs DNS lookup to resolve Inet_addr.t
.
val sexp_of_addr_info_blocking_sexp :
addr_info_blocking_sexp ->
Sexplib0.Sexp.t
val addr_info_blocking_sexp_of_sexp :
Sexplib0.Sexp.t ->
addr_info_blocking_sexp
type getaddrinfo_option =
| AI_FAMILY of socket_domain
Impose the given socket domain
*)| AI_SOCKTYPE of socket_type
Impose the given socket type
*)| AI_PROTOCOL of int
Impose the given protocol
*)| AI_NUMERICHOST
Do not call name resolver, expect numeric IP address
*)| AI_CANONNAME
Fill the ai_canonname
field of the result
| AI_PASSIVE
Options to Unix.getaddrinfo
.
val sexp_of_getaddrinfo_option : getaddrinfo_option -> Sexplib0.Sexp.t
val getaddrinfo_option_of_sexp : Sexplib0.Sexp.t -> getaddrinfo_option
val getaddrinfo : string -> string -> getaddrinfo_option list -> addr_info list
getaddrinfo host service opts
returns a list of Unix.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 in opts
cannot be satisfied.
host
is either a host name or the string representation of an IP address. host
can be given as the empty string; in this case, the ``any'' address or the ``loopback'' address are used, depending whether opts
contains AI_PASSIVE
. service
is either a service name or the string representation of a port number. service
can be given as the empty string; in this case, the port field of the returned addresses is set to 0. opts
is 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 -> Sexplib0.Sexp.t
val name_info_of_sexp : Sexplib0.Sexp.t -> name_info
Options to Unix.getnameinfo
.
val sexp_of_getnameinfo_option : getnameinfo_option -> Sexplib0.Sexp.t
val getnameinfo_option_of_sexp : Sexplib0.Sexp.t -> getnameinfo_option
val getnameinfo : sockaddr -> getnameinfo_option list -> name_info
getnameinfo addr opts
returns the host name and service name corresponding to the socket address addr
. opts
is a possibly empty list of options that governs how these names are obtained. Raise Caml.Not_found
or Not_found_s
if an error occurs.
The following functions implement the POSIX standard terminal interface. They provide control over asynchronous communication ports and pseudo-terminals. Refer to the termios
man page for a complete description.
module Terminal_io : sig ... end
val get_sockaddr : string -> int -> sockaddr
Get a sockaddr from a hostname or IP, and a port
val set_in_channel_timeout : Core.In_channel.t -> float -> unit
Set a timeout for a socket associated with an In_channel.t
val set_out_channel_timeout : Core.Out_channel.t -> float -> unit
Set a timeout for a socket associated with an Out_channel.t
exit_immediately exit_code
immediately calls the exit
system call with the given exit code without performing any other actions (unlike Caml.exit). Does not return.
val mknod :
?file_kind:file_kind ->
?perm:int ->
?major:int ->
?minor:int ->
string ->
unit
mknod ?file_kind ?perm ?major ?minor path
creates 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. Use Unix.mkdir
and Unix.symlink
instead there respectively.
module IOVec : sig ... end
I/O-vectors for scatter/gather-operations
val dirfd : dir_handle -> File_descr.t
Extract a file descriptor from a directory handle.
val fsync : File_descr.t -> unit
val fdatasync : File_descr.t -> unit
Synchronize the kernel buffers of a given file descriptor with disk, but do not necessarily write file attributes.
val read_assume_fd_is_nonblocking :
File_descr.t ->
?pos:int ->
?len:int ->
Core.Bytes.t ->
int
read_assume_fd_is_nonblocking fd ?pos ?len buf
calls the system call read
ASSUMING THAT IT IS NOT GOING TO BLOCK. Reads at most len
bytes into buffer buf
starting at position pos
.
val write_assume_fd_is_nonblocking :
File_descr.t ->
?pos:int ->
?len:int ->
Core.Bytes.t ->
int
write_assume_fd_is_nonblocking fd ?pos ?len buf
calls the system call write
ASSUMING THAT IT IS NOT GOING TO BLOCK. Writes at most len
bytes from buffer buf
starting at position pos
.
val writev_assume_fd_is_nonblocking :
File_descr.t ->
?count:int ->
string IOVec.t array ->
int
writev_assume_fd_is_nonblocking fd ?count iovecs
calls the system call writev
ASSUMING THAT IT IS NOT GOING TO BLOCK using count
I/O-vectors iovecs
.
val writev : File_descr.t -> ?count:int -> string IOVec.t array -> int
writev fd ?count iovecs
like writev_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.
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 list
pselect rfds wfds efds timeout sigmask
like Core_unix.select
but also allows one to wait for the arrival of signals.
module RLimit : sig ... end
module Resource_usage : sig ... end
val wait_with_resource_usage :
?restart:bool ->
wait_on ->
(Core.Pid.t * Exit_or_signal.t) * Resource_usage.t
val sexp_of_sysconf : sysconf -> Sexplib0.Sexp.t
val sysconf_of_sexp : Sexplib0.Sexp.t -> sysconf
val sysconf : sysconf -> int64 option
Wrapper over sysconf
function in C.
val sysconf_exn : sysconf -> int64
val mkstemp : string -> string * File_descr.t
mkstemp prefix
creates and opens a unique temporary file with prefix
, automatically appending a suffix of .tmp.
followed by six random characters to make the name unique. Unlike C's mkstemp
, prefix
should not include six X's at the end.
The file descriptor will have close-on-exec flag set, atomically when the O_CLOEXEC flag is supported.
mkdtemp prefix
creates a temporary directory with prefix
, automatically appending a suffix of .tmp.
followed by six random characters to make the name unique.
Causes abnormal program termination unless the signal SIGABRT is caught and the signal handler does not return. If the SIGABRT signal is blocked or ignored, the abort() function will still override it.
getgrouplist user group
returns the list of groups to which user
belongs. See 'man getgrouplist'.
Return the list of groups to which the user executing the process belongs.
val fnmatch :
?flags:
[ `No_escape
| `Pathname
| `Period
| `File_name
| `Leading_dir
| `Casefold ]
list ->
pat:string ->
string ->
bool
no system calls involved
val wordexp :
(?flags:[ `No_cmd | `Show_err | `Undef ] list ->
string ->
string array)
Core.Or_error.t
See man page for wordexp.
module Utsname : sig ... end
val uname : unit -> Utsname.t
See man page for uname.
if_indextoname ifindex
If ifindex
is an interface index, then the function returns the interface name. Otherwise, it raises Unix_error
.
if_nametoindex ifname
If ifname
is an interface name, then the function returns the interface index. Otherwise, it raises Unix_error
.
val mcast_join :
?ifname:string ->
?source:Inet_addr.t ->
File_descr.t ->
sockaddr ->
unit
mcast_join ?ifname ?source sock addr
join a multicast group at addr
with socket sock
, from source at source
if specified, optionally using network interface ifname
.
val mcast_leave :
?ifname:string ->
?source:Inet_addr.t ->
File_descr.t ->
sockaddr ->
unit
mcast_leave ?ifname ?source sock addr
leaves a multicast group at addr
with socket sock
, from source at source
if specified, optionally using network interface ifname
.
val get_mcast_ttl : File_descr.t -> int
get_mcast_ttl sock
reads the time-to-live value of outgoing multicast packets for socket sock
.
val set_mcast_ttl : File_descr.t -> int -> unit
set_mcast_ttl sock ttl
sets the time-to-live value of outgoing multicast packets for socket sock
to ttl
.
val get_mcast_loop : File_descr.t -> bool
get_mcast_loop sock
reads the boolean argument that determines whether sent multicast packets are looped back to local sockets.
val set_mcast_loop : File_descr.t -> bool -> unit
set_mcast_loop sock loop
sets the boolean argument that determines whether sent multicast packets are looped back to local sockets.
val set_mcast_ifname : File_descr.t -> string -> unit
set_mcast_ifname sock "eth0"
sets outgoing multicast traffic on IPv4 UDP socket sock
to go out through interface eth0
.
This uses setsockopt
with IP_MULTICAST_IF
and applies to multicast traffic. For non-multicast applications, see Linux_ext.bind_to_interface
.
module Scheduler : sig ... end
module Priority : sig ... end
module Mman : sig ... end
For keeping your memory in RAM, i.e. preventing it from being swapped out.
module Ifaddr : sig ... end
A network interface on the local machine. See man getifaddrs
.
val getifaddrs : unit -> Ifaddr.t list
module Expert : sig ... end
module Stable : sig ... end