package core_extended

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type
include module type of struct include Core.Unix end
module File_descr = Core.Unix.File_descr

File descriptor.

Error report
type error = Unix.error =
  1. | E2BIG
  2. | EACCES
  3. | EAGAIN
  4. | EBADF
  5. | EBUSY
  6. | ECHILD
  7. | EDEADLK
  8. | EDOM
  9. | EEXIST
  10. | EFAULT
  11. | EFBIG
  12. | EINTR
  13. | EINVAL
  14. | EIO
  15. | EISDIR
  16. | EMFILE
  17. | ENAMETOOLONG
  18. | ENFILE
  19. | ENODEV
  20. | ENOENT
  21. | ENOEXEC
  22. | ENOLCK
  23. | ENOMEM
  24. | ENOSPC
  25. | ENOSYS
  26. | ENOTDIR
  27. | ENOTEMPTY
  28. | ENOTTY
  29. | ENXIO
  30. | EPERM
  31. | EPIPE
  32. | ERANGE
  33. | EROFS
  34. | ESPIPE
  35. | ESRCH
  36. | EXDEV
  37. | EWOULDBLOCK
  38. | EINPROGRESS
  39. | EALREADY
  40. | ENOTSOCK
  41. | EDESTADDRREQ
  42. | EMSGSIZE
  43. | EPROTOTYPE
  44. | ENOPROTOOPT
  45. | EPROTONOSUPPORT
  46. | ESOCKTNOSUPPORT
  47. | EOPNOTSUPP
  48. | EPFNOSUPPORT
  49. | EAFNOSUPPORT
  50. | EADDRINUSE
  51. | EADDRNOTAVAIL
  52. | ENETDOWN
  53. | ENETUNREACH
  54. | ENETRESET
  55. | ECONNABORTED
  56. | ECONNRESET
  57. | ENOBUFS
  58. | EISCONN
  59. | ENOTCONN
  60. | ESHUTDOWN
  61. | ETOOMANYREFS
  62. | ETIMEDOUT
  63. | ECONNREFUSED
  64. | EHOSTDOWN
  65. | EHOSTUNREACH
  66. | ELOOP
  67. | EOVERFLOW
  68. | EUNKNOWNERR of int
  • deprecated [since 2016-10] use [Unix.Error.t] instead
val sexp_of_error : Unix.error -> Core_kernel.Sexp.t
  • deprecated [since 2016-10] use [Unix.Error.t] instead
val error_of_sexp : Core_kernel.Sexp.t -> Unix.error
  • deprecated [since 2016-10] use [Unix.Error.t] instead
module Error = Core.Unix.Error
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 = Core.Unix.Syscall_result
val unix_error : int -> string -> string -> _
  • raises Unix_error

    with a given errno, function name and argument

val error_message : Error.t -> string
  • deprecated [since 2016-10] use [Unix.Error.message] instead
val handle_unix_error : (unit -> 'a) -> 'a

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.

val retry_until_no_eintr : (unit -> 'a) -> 'a

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.

Access to the process environment

If you're looking for getenv, that's in the Sys module.

val environment : unit -> string array

Return the process environment, as an array of strings with the format ``variable=value''.

val putenv : key:string -> data:string -> unit

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.

val unsetenv : string -> unit

unsetenv name deletes the variable name from the environment.

EINVAL name contained an ’=’ or an '\000' character.

Process handling
module Exit = Core.Unix.Exit

The termination status of a process.

module Exit_or_signal = Core.Unix.Exit_or_signal
module Exit_or_signal_or_stop = Core.Unix.Exit_or_signal_or_stop
type env = [
  1. | `Replace of (string * string) list
  2. | `Extend of (string * string) list
  3. | `Replace_raw of string list
]

env is used to control the environment of a child process, and can take three forms. `Replace_raw replaces the entire environment with strings in the Unix style, like "VARIABLE_NAME=value". `Replace has the same effect as `Replace_raw, but using bindings represented as "VARIABLE_NAME", "value". `Extend adds entries to the existing environment rather than replacing the whole environment.

If env contains multiple bindings for the same variable, the last takes precedence. In the case of `Extend, bindings in env take precedence over the existing environment.

include sig ... end
val env_of_sexp : Sexplib.Sexp.t -> env
val __env_of_sexp__ : Sexplib.Sexp.t -> env
val sexp_of_env : env -> Sexplib.Sexp.t
val exec : prog:string -> argv:string list -> ?use_path:bool -> ?env:env -> unit -> Core_kernel.Nothing.t

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.

The first element in argv should be the program itself; the correct way to call exec is:

exec ~prog ~argv:[ prog; arg1; arg2; ...] ()    
val fork : unit -> [ `In_the_child | `In_the_parent of Core_kernel.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 no such process exists. 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.

type wait_on = [
  1. | `Any
  2. | `Group of Core_kernel.Pid.t
  3. | `My_group
  4. | `Pid of Core_kernel.Pid.t
]
include sig ... end
val wait_on_of_sexp : Sexplib.Sexp.t -> wait_on
val __wait_on_of_sexp__ : Sexplib.Sexp.t -> wait_on
val sexp_of_wait_on : wait_on -> Sexplib.Sexp.t
val wait : ?restart:bool -> wait_on -> Core_kernel.Pid.t * Exit_or_signal.t
val wait_nohang : wait_on -> (Core_kernel.Pid.t * Exit_or_signal.t) option
val wait_untraced : ?restart:bool -> wait_on -> Core_kernel.Pid.t * Exit_or_signal_or_stop.t
val wait_nohang_untraced : wait_on -> (Core_kernel.Pid.t * Exit_or_signal_or_stop.t) option

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_kernel.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_kernel.Pid.t

Return the pid of the process.

val getppid : unit -> Core_kernel.Pid.t option

Return the pid of the parent process.

val getppid_exn : unit -> Core_kernel.Pid.t

Return the pid of the parent process, if you're really sure you're never going to be the init process.

module Thread_id = Core.Unix.Thread_id
val gettid : (unit -> Thread_id.t) Core_kernel.Or_error.t

Get the numeric ID of the current thread, e.g. for identifying it in top(1).

val nice : int -> int

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.

Basic file input/output

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 = Unix.open_flag =
  1. | O_RDONLY
    (*

    Open for reading

    *)
  2. | O_WRONLY
    (*

    Open for writing

    *)
  3. | O_RDWR
    (*

    Open for reading and writing

    *)
  4. | O_NONBLOCK
    (*

    Open in non-blocking mode

    *)
  5. | O_APPEND
    (*

    Open for append

    *)
  6. | O_CREAT
    (*

    Create if nonexistent

    *)
  7. | O_TRUNC
    (*

    Truncate to 0 length if existing

    *)
  8. | O_EXCL
    (*

    Fail if existing

    *)
  9. | O_NOCTTY
    (*

    Don't make this dev a controlling tty

    *)
  10. | O_DSYNC
    (*

    Writes complete as `Synchronised I/O data integrity completion'

    *)
  11. | O_SYNC
    (*

    Writes complete as `Synchronised I/O file integrity completion'

    *)
  12. | O_RSYNC
    (*

    Reads complete as writes (depending on O_SYNC/O_DSYNC)

    *)
  13. | O_SHARE_DELETE
    (*

    Windows only: allow the file to be deleted while still open

    *)
  14. | O_CLOEXEC
    (*

    Set the close-on-exec flag on the descriptor returned by openfile

    *)
  15. | O_KEEPEXEC
val open_flag_of_sexp : Core_kernel.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_kernel.Sexp.t
type file_perm = int

file access rights

include sig ... end
val file_perm_of_sexp : Sexplib.Sexp.t -> file_perm
val sexp_of_file_perm : file_perm -> Sexplib.Sexp.t
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 = Core.Unix.Open_flags
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 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:string -> int

read fd buff ofs len reads len characters from descriptor fd, storing them in string buff, starting at position ofs in string buff. Return the number of characters actually read.

val write : ?pos:int -> ?len:int -> File_descr.t -> buf:string -> int

write fd buff ofs len writes len characters to descriptor fd, taking them from string buff, starting at position ofs in string buff. Return the number of characters 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 single_write : ?restart:bool -> ?pos:int -> ?len:int -> File_descr.t -> buf:string -> int

Same as write but ensures that all errors are reported and that no character has ever been written when an error is reported.

Interfacing with the standard input/output library
val in_channel_of_descr : File_descr.t -> Core_kernel.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_kernel.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_kernel.In_channel.t -> File_descr.t

Return the descriptor corresponding to an input channel.

val descr_of_out_channel : Core_kernel.Out_channel.t -> File_descr.t

Return the descriptor corresponding to an output channel.

Seeking and truncating
type seek_command = Unix.seek_command =
  1. | SEEK_SET
    (*

    indicates positions relative to the beginning of the file

    *)
  2. | SEEK_CUR
    (*

    indicates positions relative to the current position

    *)
  3. | SEEK_END
    (*

    indicates positions relative to the end of the file

    *)

POSITIONING modes for UnixLabels.lseek.

include sig ... end
val seek_command_of_sexp : Sexplib.Sexp.t -> seek_command
val sexp_of_seek_command : seek_command -> Sexplib.Sexp.t
val lseek : File_descr.t -> int64 -> mode:seek_command -> int64

Set the current position for a file descriptor

val truncate : string -> len:int64 -> unit

Truncates the named file to the given size.

val ftruncate : File_descr.t -> len:int64 -> unit

Truncates the file corresponding to the given descriptor to the given size.

File statistics
type file_kind = Unix.file_kind =
  1. | S_REG
    (*

    Regular file

    *)
  2. | S_DIR
    (*

    Directory

    *)
  3. | S_CHR
    (*

    Character device

    *)
  4. | S_BLK
    (*

    Block device

    *)
  5. | S_LNK
    (*

    Symbolic link

    *)
  6. | S_FIFO
    (*

    Named pipe

    *)
  7. | S_SOCK
    (*

    Socket

    *)
include sig ... end
val file_kind_of_sexp : Sexplib.Sexp.t -> file_kind
val sexp_of_file_kind : file_kind -> Sexplib.Sexp.t
type stats = Unix.LargeFile.stats = {
  1. st_dev : int;
    (*

    Device number

    *)
  2. st_ino : int;
    (*

    Inode number

    *)
  3. st_kind : file_kind;
    (*

    Kind of the file

    *)
  4. st_perm : file_perm;
    (*

    Access rights

    *)
  5. st_uid : int;
    (*

    User id of the owner

    *)
  6. st_gid : int;
    (*

    Group ID of the file's group

    *)
  7. st_rdev : int;
    (*

    Device minor number

    *)
  8. st_size : int64;
    (*

    Size in bytes

    *)
  9. st_atime : float;
    (*

    Last access time

    *)
  10. st_mtime : float;
    (*

    Last modification time

    *)
  11. 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.

include sig ... end
val stats_of_sexp : Sexplib.Sexp.t -> stats
val sexp_of_stats : stats -> Sexplib.Sexp.t
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 = Core.Unix.Native_file

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

Locking
type lock_command = Unix.lock_command =
  1. | F_ULOCK
    (*

    Unlock a region

    *)
  2. | F_LOCK
    (*

    Lock a region for writing, and block if already locked

    *)
  3. | F_TLOCK
    (*

    Lock a region for writing, or fail if already locked

    *)
  4. | F_TEST
    (*

    Test a region for other process locks

    *)
  5. | F_RLOCK
    (*

    Lock a region for reading, and block if already locked

    *)
  6. | F_TRLOCK
    (*

    Lock a region for reading, or fail if already locked

    *)

Commands for lockf.

include sig ... end
val lock_command_of_sexp : Sexplib.Sexp.t -> lock_command
val sexp_of_lock_command : lock_command -> Sexplib.Sexp.t
val lockf : File_descr.t -> mode:lock_command -> len:Core_kernel.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.

module Flock_command = Core.Unix.Flock_command
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.

val isatty : File_descr.t -> bool

Return true if the given file descriptor refers to a terminal or console window, false otherwise.

Operations on file names

Removes the named file

val remove : string -> unit

Removes the named file or directory

val rename : src:string -> dst:string -> unit

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.

File permissions and ownership
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.

val chown : string -> uid:int -> gid:int -> unit

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 umask : int -> int

Set the process creation mask, and return the previous mask.

val access : string -> [ `Read | `Write | `Exec | `Exists ] list -> (unit, exn) Core_kernel.Result.t

Check that the process has the given permissions over the named file.

val access_exn : string -> [ `Read | `Write | `Exec | `Exists ] list -> unit
Operations on file descriptors

Return a new file descriptor referencing the same file as the given descriptor.

val dup2 : src:File_descr.t -> dst:File_descr.t -> 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 clear_close_on_exec : File_descr.t -> unit

Clear the ``close-on-exec'' flag on the given descriptor. See UnixLabels.set_close_on_exec.

Directories
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.

val rmdir : string -> unit

Remove an empty directory.

val chdir : string -> unit

Change the process working directory.

val getcwd : unit -> string

Return the name of the current working directory.

val chroot : string -> unit

Change the process root directory.

type dir_handle = Unix.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.

  • deprecated [since 2016-08] use [readdir_opt] instead
val rewinddir : dir_handle -> unit

Reposition the descriptor to the beginning of the directory

val closedir : dir_handle -> unit

Close a directory descriptor.

Pipes and redirections
val pipe : 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.

High-level process and redirection management
module Process_info = Core.Unix.Process_info

Low-level process

val create_process_backend : [ `ml_create_process | `spawn_vfork ] Pervasives.ref

The backend used to spawn child processes. As of 2016-11:

`ml_create_process is a backend we've been using for years, but it has some known disadvantages (it's much slower, error handling is not as nice, it has some theoretical race conditions, it's less general).

`spawn_vfork has almost no known disadvantages, but it's new, and therefore could have some less subtle bugs.

This defaults to `spawn_vfork unless CORE_CREATE_PROCESS_DONT_USE_SPAWN_BACKEND_UNLESS_TOLD_TO environment variable is set, which in turn can be overridden by CORE_CREATE_PROCESS_USE_SPAWN_BACKEND.

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: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.

val open_process_in : string -> Core_kernel.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 Pervasives.flush at the right times to ensure correct synchronization.

val open_process_out : string -> Core_kernel.Out_channel.t
module Process_channels = Core.Unix.Process_channels

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_kernel.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_kernel.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.

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 source dest creates the file dest as a symbolic link to the file source. On Windows, this has the semantics using stat as described at: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html

Read the contents of a link.

Polling
module Select_fds = Core.Unix.Select_fds
type select_timeout = [
  1. | `Never
  2. | `Immediately
  3. | `After of Core_kernel.Time_ns.Span.t
]
include sig ... end
val sexp_of_select_timeout : select_timeout -> Sexplib.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)...

val pause : unit -> unit

Wait until a non-ignored, non-blocked signal is delivered.

Time functions
type process_times = Unix.process_times = {
  1. tms_utime : float;
    (*

    User time for the process

    *)
  2. tms_stime : float;
    (*

    System time for the process

    *)
  3. tms_cutime : float;
    (*

    User time for the children processes

    *)
  4. tms_cstime : float;
    (*

    System time for the children processes

    *)
}

The execution times (CPU times) of a process.

include sig ... end
val process_times_of_sexp : Sexplib.Sexp.t -> process_times
val sexp_of_process_times : process_times -> Sexplib.Sexp.t
type tm = Unix.tm = {
  1. tm_sec : int;
    (*

    Seconds 0..59

    *)
  2. tm_min : int;
    (*

    Minutes 0..59

    *)
  3. tm_hour : int;
    (*

    Hours 0..23

    *)
  4. tm_mday : int;
    (*

    Day of month 1..31

    *)
  5. tm_mon : int;
    (*

    Month of year 0..11

    *)
  6. tm_year : int;
    (*

    Year - 1900

    *)
  7. tm_wday : int;
    (*

    Day of week (Sunday is 0)

    *)
  8. tm_yday : int;
    (*

    Day of year 0..365

    *)
  9. tm_isdst : bool;
    (*

    Daylight time savings in effect

    *)
}

The type representing wallclock time and calendar date.

include sig ... end
val tm_of_sexp : Sexplib.Sexp.t -> tm
val sexp_of_tm : tm -> Sexplib.Sexp.t
val time : unit -> float

Return the current time since 00:00:00 GMT, Jan. 1, 1970, in seconds.

val gettimeofday : unit -> float

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.

val mktime : tm -> float * tm

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 alarm : int -> int

Schedule a SIGALRM signal after the given number of seconds.

val sleep : int -> unit

Stop execution for the given number of seconds.

val nanosleep : float -> float

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.

val utimes : string -> access:float -> modif:float -> unit

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 = Unix.interval_timer =
  1. | ITIMER_REAL
    (*

    decrements in real time, and sends the signal SIGALRM when expired.

    *)
  2. | ITIMER_VIRTUAL
    (*

    decrements in process virtual time, and sends SIGVTALRM when expired.

    *)
  3. | 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.

include sig ... end
val interval_timer_of_sexp : Sexplib.Sexp.t -> interval_timer
val sexp_of_interval_timer : interval_timer -> Sexplib.Sexp.t
type interval_timer_status = Unix.interval_timer_status = {
  1. it_interval : float;
    (*

    Period

    *)
  2. it_value : float;
    (*

    Current value of the timer

    *)
}

The type describing the status of an interval timer

include sig ... end
val interval_timer_status_of_sexp : Sexplib.Sexp.t -> interval_timer_status
val sexp_of_interval_timer_status : interval_timer_status -> Sexplib.Sexp.t

Return the current status of the given interval timer.

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.

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 getuid : unit -> int

Return the user id of the user executing the process.

val geteuid : unit -> int

Return the effective user id under which the process runs.

val setuid : int -> unit

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.

val getgid : unit -> int

Return the group id of the user executing the process.

val getegid : unit -> int

Return the effective group id under which the process runs.

val setgid : int -> unit

Set the real group id and effective group id for the process.

module Passwd = Core.Unix.Passwd

Structure of entries in the passwd database

module Group = Core.Unix.Group

Structure of entries in the groups database.

val getlogin : unit -> string

Return the login name of the user executing the process.

module Protocol_family = Core.Unix.Protocol_family
Internet addresses
module Inet_addr = Core.Unix.Inet_addr
module Cidr = Core.Unix.Cidr

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".

Sockets
type socket_domain = Unix.socket_domain =
  1. | PF_UNIX
    (*

    Unix domain

    *)
  2. | PF_INET
    (*

    Internet domain

    *)
  3. | PF_INET6
    (*

    Internet domain (IPv6)

    *)

The type of socket domains.

include sig ... end
val socket_domain_of_sexp : Sexplib.Sexp.t -> socket_domain
val sexp_of_socket_domain : socket_domain -> Sexplib.Sexp.t
val bin_read_socket_domain : socket_domain Core_kernel.Bin_prot.Read.reader
val __bin_read_socket_domain__ : (int -> socket_domain) Core_kernel.Bin_prot.Read.reader
val bin_size_socket_domain : socket_domain Core_kernel.Bin_prot.Size.sizer
val bin_write_socket_domain : socket_domain Core_kernel.Bin_prot.Write.writer
val bin_shape_socket_domain : Core_kernel.Bin_prot.Shape.t
type socket_type = Unix.socket_type =
  1. | SOCK_STREAM
    (*

    Stream socket

    *)
  2. | SOCK_DGRAM
    (*

    Datagram socket

    *)
  3. | SOCK_RAW
    (*

    Raw socket

    *)
  4. | SOCK_SEQPACKET
    (*

    Sequenced packets socket

    *)

The type of socket kinds, specifying the semantics of communications.

include sig ... end
val socket_type_of_sexp : Sexplib.Sexp.t -> socket_type
val sexp_of_socket_type : socket_type -> Sexplib.Sexp.t
val __bin_read_socket_type__ : (int -> socket_type) Core_kernel.Bin_prot.Read.reader
val bin_size_socket_type : socket_type Core_kernel.Bin_prot.Size.sizer
val bin_shape_socket_type : Core_kernel.Bin_prot.Shape.t
type sockaddr = Unix.sockaddr =
  1. | ADDR_UNIX of string
  2. | ADDR_INET of Inet_addr.t * int

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.

include sig ... end
val __bin_read_sockaddr__ : (int -> sockaddr) Core_kernel.Bin_prot.Read.reader
val bin_shape_sockaddr : Core_kernel.Bin_prot.Shape.t
val sexp_of_sockaddr : sockaddr -> Sexplib.Sexp.t
val sockaddr_of_sexp : Core_kernel.Sexp.t -> sockaddr
  • deprecated [since 2015-10] Replace [sockaddr] by [sockaddr_blocking_sexp]
type sockaddr_blocking_sexp = sockaddr

sockaddr_blocking_sexp is like sockaddr, with of_sexp that performs DNS lookup to resolve Inet_addr.t.

include sig ... end
val bin_read_sockaddr_blocking_sexp : sockaddr_blocking_sexp Core_kernel.Bin_prot.Read.reader
val __bin_read_sockaddr_blocking_sexp__ : (int -> sockaddr_blocking_sexp) Core_kernel.Bin_prot.Read.reader
val bin_reader_sockaddr_blocking_sexp : sockaddr_blocking_sexp Core_kernel.Bin_prot.Type_class.reader
val bin_size_sockaddr_blocking_sexp : sockaddr_blocking_sexp Core_kernel.Bin_prot.Size.sizer
val bin_write_sockaddr_blocking_sexp : sockaddr_blocking_sexp Core_kernel.Bin_prot.Write.writer
val bin_writer_sockaddr_blocking_sexp : sockaddr_blocking_sexp Core_kernel.Bin_prot.Type_class.writer
val bin_shape_sockaddr_blocking_sexp : Core_kernel.Bin_prot.Shape.t
val sockaddr_blocking_sexp_of_sexp : Sexplib.Sexp.t -> sockaddr_blocking_sexp
val sexp_of_sockaddr_blocking_sexp : sockaddr_blocking_sexp -> Sexplib.Sexp.t
val domain_of_sockaddr : sockaddr -> socket_domain

Return the socket domain adequate for the given socket address.

val socket : domain:socket_domain -> kind:socket_type -> protocol:int -> 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 : domain:socket_domain -> kind:socket_type -> protocol:int -> File_descr.t * File_descr.t

Create a pair of unnamed sockets, connected together.

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 = Unix.shutdown_command =
  1. | SHUTDOWN_RECEIVE
    (*

    Close for receiving

    *)
  2. | SHUTDOWN_SEND
    (*

    Close for sending

    *)
  3. | SHUTDOWN_ALL
    (*

    Close both

    *)

The type of commands for shutdown.

include sig ... end
val shutdown_command_of_sexp : Sexplib.Sexp.t -> shutdown_command
val sexp_of_shutdown_command : shutdown_command -> Sexplib.Sexp.t
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.

type msg_flag = Unix.msg_flag =
  1. | MSG_OOB
  2. | MSG_DONTROUTE
  3. | MSG_PEEK
include sig ... end
val msg_flag_of_sexp : Sexplib.Sexp.t -> msg_flag
val sexp_of_msg_flag : msg_flag -> Sexplib.Sexp.t
val recv : File_descr.t -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> int

Receive data from a connected socket.

val recvfrom : File_descr.t -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> int * sockaddr

Receive data from an unconnected socket.

val send : File_descr.t -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> int

Send data over a connected socket.

val sendto : File_descr.t -> buf:string -> pos:int -> len:int -> mode:msg_flag list -> addr:sockaddr -> int

Send data over an unconnected socket.

Socket options
type socket_bool_option =
  1. | SO_DEBUG
    (*

    Record debugging information

    *)
  2. | SO_BROADCAST
    (*

    Permit sending of broadcast messages

    *)
  3. | SO_REUSEADDR
    (*

    Allow reuse of local addresses for bind

    *)
  4. | SO_KEEPALIVE
    (*

    Keep connection active

    *)
  5. | SO_DONTROUTE
    (*

    Bypass the standard routing algorithms

    *)
  6. | SO_OOBINLINE
    (*

    Leave out-of-band data in line

    *)
  7. | SO_ACCEPTCONN
    (*

    Report whether socket listening is enabled

    *)
  8. | TCP_NODELAY
    (*

    Control the Nagle algorithm for TCP sockets

    *)
  9. | IPV6_ONLY
    (*

    Forbid binding an IPv6 socket to an IPv4 address

    *)

The socket options that can be consulted with UnixLabels.getsockopt and modified with UnixLabels.setsockopt. These options have a boolean (true/false) value.

include sig ... end
val socket_bool_option_of_sexp : Sexplib.Sexp.t -> socket_bool_option
val sexp_of_socket_bool_option : socket_bool_option -> Sexplib.Sexp.t
type socket_int_option =
  1. | SO_SNDBUF
    (*

    Size of send buffer

    *)
  2. | SO_RCVBUF
    (*

    Size of received buffer

    *)
  3. | SO_ERROR
    (*

    Report the error status and clear it

    *)
  4. | SO_TYPE
    (*

    Report the socket type

    *)
  5. | SO_RCVLOWAT
    (*

    Minimum number of bytes to process for input operations

    *)
  6. | 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.

include sig ... end
val socket_int_option_of_sexp : Sexplib.Sexp.t -> socket_int_option
val sexp_of_socket_int_option : socket_int_option -> Sexplib.Sexp.t
type socket_optint_option =
  1. | SO_LINGER
    (*

    Whether 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 with UnixLabels.setsockopt_optint. These options have a value of type int option, with None meaning ``disabled''.

type socket_float_option =
  1. | SO_RCVTIMEO
    (*

    Timeout for input operations

    *)
  2. | SO_SNDTIMEO
    (*

    Timeout for output operations

    *)

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.

include sig ... end
val socket_float_option_of_sexp : Sexplib.Sexp.t -> socket_float_option
val sexp_of_socket_float_option : socket_float_option -> Sexplib.Sexp.t
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.

High-level network connection functions

Connect to a server at the given address. Return a pair of buffered channels connected to the server. Remember to call Pervasives.flush on the output channel at the right times to ensure correct synchronization.

val shutdown_connection : Core_kernel.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_kernel.In_channel.t -> Core_kernel.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.

Host and protocol databases
val gethostname : unit -> string

Return the name of the local host.

module Host = Core.Unix.Host
module Protocol = Core.Unix.Protocol
module Service = Core.Unix.Service
type addr_info = {
  1. ai_family : socket_domain;
    (*

    Socket domain

    *)
  2. ai_socktype : socket_type;
    (*

    Socket type

    *)
  3. ai_protocol : int;
    (*

    Socket protocol number

    *)
  4. ai_addr : sockaddr;
    (*

    Address

    *)
  5. ai_canonname : string;
    (*

    Canonical host name

    *)
}

Address information returned by Unix.getaddrinfo.

include sig ... end
val sexp_of_addr_info : addr_info -> Sexplib.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.

include sig ... end
val addr_info_blocking_sexp_of_sexp : Sexplib.Sexp.t -> addr_info_blocking_sexp
val sexp_of_addr_info_blocking_sexp : addr_info_blocking_sexp -> Sexplib.Sexp.t
type getaddrinfo_option =
  1. | AI_FAMILY of socket_domain
    (*

    Impose the given socket domain

    *)
  2. | AI_SOCKTYPE of socket_type
    (*

    Impose the given socket type

    *)
  3. | AI_PROTOCOL of int
    (*

    Impose the given protocol

    *)
  4. | AI_NUMERICHOST
    (*

    Do not call name resolver, expect numeric IP address

    *)
  5. | AI_CANONNAME
    (*

    Fill the ai_canonname field of the result

    *)
  6. | AI_PASSIVE
    (*

    Set address to ``any'' address for use with Unix.bind

    *)

Options to Unix.getaddrinfo.

include sig ... end
val getaddrinfo_option_of_sexp : Sexplib.Sexp.t -> getaddrinfo_option
val sexp_of_getaddrinfo_option : getaddrinfo_option -> Sexplib.Sexp.t
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 = {
  1. ni_hostname : string;
    (*

    Name or IP address of host

    *)
  2. ni_service : string;
    (*

    Name of service or port number

    *)
}

Host and service information returned by Unix.getnameinfo.

include sig ... end
val name_info_of_sexp : Sexplib.Sexp.t -> name_info
val sexp_of_name_info : name_info -> Sexplib.Sexp.t
type getnameinfo_option =
  1. | NI_NOFQDN
    (*

    Do not qualify local host names

    *)
  2. | NI_NUMERICHOST
    (*

    Always return host as IP address

    *)
  3. | NI_NAMEREQD
    (*

    Fail if host name cannot be determined

    *)
  4. | NI_NUMERICSERV
    (*

    Always return service as port number

    *)
  5. | NI_DGRAM
    (*

    Consider the service as UDP-based instead of the default TCP

    *)

Options to Unix.getnameinfo.

include sig ... end
val getnameinfo_option_of_sexp : Sexplib.Sexp.t -> getnameinfo_option
val sexp_of_getnameinfo_option : getnameinfo_option -> Sexplib.Sexp.t
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 Not_found if an error occurs.

Terminal interface

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 = Core.Unix.Terminal_io
val get_sockaddr : string -> int -> sockaddr

Get a sockaddr from a hostname or IP, and a port

val set_in_channel_timeout : Core_kernel.In_channel.t -> float -> unit

Set a timeout for a socket associated with an In_channel.t

val set_out_channel_timeout : Core_kernel.Out_channel.t -> float -> unit

Set a timeout for a socket associated with an Out_channel.t

val exit_immediately : int -> _

exit_immediately exit_code immediately calls the exit system call with the given exit code without performing any other actions (unlike Pervasives.exit). Does not return.

Filesystem functions

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.

  • raises Invalid_argument

    if an unsupported file kind is used.

  • 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 = Core.Unix.IOVec

I/O-vectors for scatter/gather-operations

I/O functions

val dirfd : dir_handle -> File_descr.t

Extract a file descriptor from a directory handle.

val sync : unit -> unit

Synchronize all filesystem buffers with disk.

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 readdir_ino_opt : dir_handle -> (string * nativeint) option

readdir_ino_opt dh return the next entry in a directory (((filename, inode)). Returns None when the end of the directory has been reached.

val readdir_ino : dir_handle -> string * nativeint

Same as readdir_ino_opt except that it signals the end of the directory by raising End_of_file.

  • deprecated [since 2016-08] use readdir_ino_opt instead
val read_assume_fd_is_nonblocking : File_descr.t -> ?pos:int -> ?len:int -> string -> 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.

  • returns

    the number of bytes actually read.

  • raises Invalid_argument

    if buffer range out of bounds.

  • parameter pos

    = 0

  • parameter len

    = String.length buf - pos

val write_assume_fd_is_nonblocking : File_descr.t -> ?pos:int -> ?len:int -> string -> 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.

  • returns

    the number of bytes actually written.

  • raises Invalid_argument

    if buffer range out of bounds.

  • parameter pos

    = 0

  • parameter len

    = String.length buf - 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.

  • returns

    the number of bytes actually written.

  • raises Invalid_argument

    if the designated ranges are invalid.

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.

  • returns

    the number of bytes actually written.

  • raises Invalid_argument

    if the designated ranges are invalid.

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 = Core.Unix.RLimit
module Resource_usage = Core.Unix.Resource_usage
type sysconf =
  1. | ARG_MAX
  2. | CHILD_MAX
  3. | HOST_NAME_MAX
  4. | LOGIN_NAME_MAX
  5. | OPEN_MAX
  6. | PAGESIZE
  7. | RE_DUP_MAX
  8. | STREAM_MAX
  9. | SYMLOOP_MAX
  10. | TTY_NAME_MAX
  11. | TZNAME_MAX
  12. | POSIX_VERSION
  13. | PHYS_PAGES
  14. | AVPHYS_PAGES
  15. | IOV_MAX

System configuration

include sig ... end
val sysconf_of_sexp : Sexplib.Sexp.t -> sysconf
val sexp_of_sysconf : sysconf -> Sexplib.Sexp.t
val sysconf : sysconf -> int64

Temporary file and directory creation

val mkstemp : string -> string * File_descr.t

mkstemp prefix creates and opens a unique temporary file with prefix, automatically appending a suffix of 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 if O_CLOEXEC flag is supported.

val mkdtemp : string -> string

mkdtemp prefix creates a temporary directory with prefix, automatically appending a suffix of six random characters to make the name unique.

Signal handling

val abort : unit -> _

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.

User id, group id

val initgroups : string -> int -> unit
val getgrouplist : string -> int -> int array

getgrouplist user group returns the list of groups to which user belongs. See 'man getgrouplist'.

val getgroups : unit -> int array

Return the list of groups to which the user executing the process belongs.

Globbing and shell expansion

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_kernel.Or_error.t

See man page for wordexp.

System information

module Utsname = Core.Unix.Utsname
val uname : unit -> Utsname.t

See man page for uname.

Additional IP functionality

val if_indextoname : int -> string

if_indextoname ifindex If ifindex is an interface index, then the function returns the interface name. Otherwise, it raises Unix_error.

val mcast_join : ?ifname:string -> ?source:Inet_addr.t -> File_descr.t -> sockaddr -> unit

mcast_join ?ifname sock addr join a multicast group at addr with socket sock, from source at source if specified, optionally using network interface ifname.

  • parameter ifname

    default = any interface

val mcast_leave : ?ifname:string -> File_descr.t -> sockaddr -> unit

mcast_leave ?ifname sock addr leaves a multicast group at addr with socket sock, optionally using network interface ifname.

  • parameter ifname

    default = any interface

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 = Core.Unix.Scheduler
module Priority = Core.Unix.Priority
module Mman = Core.Unix.Mman

For keeping your memory in RAM, i.e. preventing it from being swapped out.

module Syslog = Core.Unix.Syslog
module Ifaddr = Core.Unix.Ifaddr

A network interface on the local machine. See man getifaddrs.

val getifaddrs : unit -> Ifaddr.t list
module Stable = Core.Unix.Stable
include module type of struct include Extended_unix end

Extensions to Core.Unix.

val fork_exec : ?stdin:Core.Unix.File_descr.t -> ?stdout:Core.Unix.File_descr.t -> ?stderr:Core.Unix.File_descr.t -> ?path_lookup:bool -> ?env: [ `Extend of (string * string) list | `Replace of (string * string) list ] -> ?working_dir:string -> ?setuid:int -> ?setgid:int -> string -> string list -> Core.Pid.t

fork_exec prog args ~stdin ~stdout ~stderr ~setuid ~setgid forks a new process that executes the program in file prog, with arguments args. The pid of the new process is returned immediately; the new process executes concurrently with the current process.

The function raises EPERM if when using set{gid,uid} and the user id is not 0.

The standard input and outputs of the new process are connected to the descriptors stdin, stdout and stderr.

The close_on_exec flag is cleared from stderr stdout and stdin so it's safe to pass in fds with close_on_exec set.

  • parameter path_lookup

    if true than we use PATH to find the process to exec. @env specifies the environment the process runs in

    ERRORS: Unix.unix_error. This function should not raise EINTR; it will restart itself automatically.

    RATIONAL: setuid and setgid do not do a full id drop (e.g.: they save the id in saved id) when the user does not have the privileges required to setuid to anyone.

    By default all file descriptors should be set_closexec ASAP after being open to avoid being captured in parallel execution of fork_exec; resetting the closexec flag on the forked flag is a cleaner and more thread safe approach.

    BUGS: The capabilities for setuid in linux are not tied to the uid 0 (man 7 capabilities). It is still fair to assume that under most system this capability is there IFF uid == 0. A more fine grain permissionning approach would make this function non-portable and be hard to implement in an async-signal-way.

    Because this function keeps the lock for most of its lifespan and restarts automatically on EINTR it might prevent the OCaml signal handlers to run in that thread.

val seteuid : int -> unit
val setreuid : uid:int -> euid:int -> unit
val ntohl : Core.Int32.t -> Core.Int32.t

Network to host order long, like C.

val htonl : Core.Int32.t -> Core.Int32.t

Host to network order long, like C.

type statvfs = Extended_unix.statvfs = {
  1. bsize : int;
    (*

    file system block size

    *)
  2. frsize : int;
    (*

    fragment size

    *)
  3. blocks : int;
    (*

    size of fs in frsize units

    *)
  4. bfree : int;
    (*

    # free blocks

    *)
  5. bavail : int;
    (*

    # free blocks for non-root

    *)
  6. files : int;
    (*

    # inodes

    *)
  7. ffree : int;
    (*

    # free inodes

    *)
  8. favail : int;
    (*

    # free inodes for non-root

    *)
  9. fsid : int;
    (*

    file system ID

    *)
  10. flag : int;
    (*

    mount flags

    *)
  11. namemax : int;
    (*

    maximum filename length

    *)
}
include sig ... end
val statvfs_of_sexp : Sexplib.Sexp.t -> statvfs
val sexp_of_statvfs : statvfs -> Sexplib.Sexp.t
val bin_read_statvfs : statvfs Core.Bin_prot.Read.reader
val __bin_read_statvfs__ : (int -> statvfs) Core.Bin_prot.Read.reader
val bin_reader_statvfs : statvfs Core.Bin_prot.Type_class.reader
val bin_size_statvfs : statvfs Core.Bin_prot.Size.sizer
val bin_write_statvfs : statvfs Core.Bin_prot.Write.writer
val bin_writer_statvfs : statvfs Core.Bin_prot.Type_class.writer
val bin_shape_statvfs : Core.Bin_prot.Shape.t
val statvfs : string -> statvfs

get file system statistics

val getloadavg : unit -> float * float * float

get load averages

module Extended_passwd = Extended_unix.Extended_passwd
val strptime : fmt:string -> string -> Core.Unix.tm

The CIDR module moved into Core.Unix

module Inet_port = Extended_unix.Inet_port

Simple int wrapper to be explicit about ports.

module Mac_address = Extended_unix.Mac_address
module Quota = Extended_unix.Quota
module Mount_entry = Extended_unix.Mount_entry
val terminal_width : int Core.Lazy.t
module Pty : sig ... end
OCaml

Innovation. Community. Security.