package async_unix

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

Unix_syscalls provides an interface to many of the functions in OCaml's standard Unix module. It uses a deferred in the return type of functions that would block. The idea is that in an Async program one does not use the standard Unix module, since in doing so one could accidentally block the whole program.

There are also a number of cosmetic changes (e.g. polymorphic variants) and other improvements (e.g. phantom types on sockets) over the standard Unix module.

module Syscall_result = Core.Unix.Syscall_result
module Exit : module type of Core.Unix.Exit
val system_exn : string -> unit Async_unix.Import.Deferred.t
val getpid : unit -> Core.Pid.t
val getppid : unit -> Core.Pid.t option
val getppid_exn : unit -> Core.Pid.t
val this_process_became_child_of_init : ?poll_delay:Core.Time.Span.t -> unit -> unit Async_unix.Import.Deferred.t

this_process_became_child_of_init returns a deferred that becomes determined when the current process becomes a child of init(8). This is useful to determine if one's parent has died, because in that case init will becomes one's parent.

See Linux_ext.pr_set_pdeathsig : Signal.t -> unit for related way to get information about parent death.

@poll_delay controls how often to check

val nice : int -> int

cores () Returns the number of cores

type open_flag = [
  1. | `Rdonly
  2. | `Wronly
  3. | `Rdwr
  4. | `Nonblock
  5. | `Append
  6. | `Creat
  7. | `Trunc
  8. | `Excl
  9. | `Noctty
  10. | `Dsync
  11. | `Sync
  12. | `Rsync
]
type file_perm = int
val openfile : ?perm:file_perm -> string -> mode:open_flag list -> Fd.t Async_unix.Import.Deferred.t
val with_file : ?exclusive:[ `Read | `Write ] -> ?perm:file_perm -> string -> mode:open_flag list -> f:(Fd.t -> 'a Async_unix.Import.Deferred.t) -> 'a Async_unix.Import.Deferred.t

with_file file ~mode ~perm ~f ?exclusive opens file, and applies f to the resulting file descriptor. When the result of f becomes determined, it closes the descriptor and returns the result of f. If exclusive is supplied, then the file descriptor is locked before calling f and unlocked after calling f.

module Open_flags : module type of Core.Unix.Open_flags

fcntl_getfl and fcntl_setf are deferred wrappers around the corresponding functions in Core.Unix for accessing the open-file-descriptor table.

val fcntl_setfl : Fd.t -> Open_flags.t -> unit Async_unix.Import.Deferred.t
include module type of Fd.Close

The Close module exists to collect close and its associated types, so they can be easily reused elsewhere, e.g. Unix_syscalls.

type socket_handling =
  1. | Shutdown_socket
  2. | Do_not_shutdown_socket
type file_descriptor_handling =
  1. | Close_file_descriptor of socket_handling
  2. | Do_not_close_file_descriptor
val close : ?file_descriptor_handling:file_descriptor_handling -> Fd.t -> unit Async_unix.Import.Deferred.t

close t prevents further use of t, and makes shutdown() and close() system calls on t's underlying file descriptor according to the file_descriptor_handling argument and whether or not t is a socket, i.e. kind t = Socket `Active:

        | file_descriptor_handling                     | shutdown() | close() |
        |----------------------------------------------+------------+---------|
        | Do_not_close_file_descriptor                 | no         | no      |
        | Close_file_descriptor Shutdown_socket        | if socket  | yes     |
        | Close_file_descriptor Do_not_shutdown_socket | no         | yes     |

The result of close becomes determined once the system calls complete. It is OK to call close multiple times on the same t; calls subsequent to the initial call will have no effect, but will return the same deferred as the original call.

val lseek : Fd.t -> int64 -> mode:[< `Set | `Cur | `End ] -> int64 Async_unix.Import.Deferred.t
val truncate : string -> len:int64 -> unit Async_unix.Import.Deferred.t
val ftruncate : Fd.t -> len:int64 -> unit Async_unix.Import.Deferred.t
val fdatasync : Fd.t -> unit Async_unix.Import.Deferred.t
val sync : unit -> unit Async_unix.Import.Deferred.t
val lockf : ?len:Core.Int64.t -> Fd.t -> [ `Read | `Write ] -> unit Async_unix.Import.Deferred.t

lockf fd read_or_write ?len exclusively locks for reading/writing the section of the open file fd specified by the current file position and len (see man lockf). It returns when the lock has been acquired. It raises if fd is closed.

val try_lockf : ?len:Core.Int64.t -> Fd.t -> [ `Read | `Write ] -> bool

try_lockf fd read_or_write ?len attempts to exclusively lock for reading/writing the section of the open file fd specified by the current file position and len (see man lockf). It returns true if it acquired the lock. It raises if fd is closed.

val test_lockf : ?len:Core.Int64.t -> Fd.t -> bool

lockf_is_locked fd ?len checks the lock on section of the open file fd specified by the current file position and len (see man lockf). If the section is unlocked or locked by this process, it returns true, else it returns false. It raises if fd is closed.

val unlockf : ?len:Core.Int64.t -> Fd.t -> unit

unlockf fd ?len unlocks the section of the open file fd specified by the current file position and len (see man lockf). It raises if fd is closed.

module File_kind : sig ... end
module Stats : sig ... end
val isatty : Fd.t -> bool Async_unix.Import.Deferred.t
val remove : string -> unit Async_unix.Import.Deferred.t
val rename : src:string -> dst:string -> unit Async_unix.Import.Deferred.t
val chmod : string -> perm:file_perm -> unit Async_unix.Import.Deferred.t
val fchmod : Fd.t -> perm:file_perm -> unit Async_unix.Import.Deferred.t
val chown : string -> uid:int -> gid:int -> unit Async_unix.Import.Deferred.t
val fchown : Fd.t -> uid:int -> gid:int -> unit Async_unix.Import.Deferred.t
val access : string -> [ `Read | `Write | `Exec | `Exists ] list -> (unit, exn) Core.Result.t Async_unix.Import.Deferred.t
val access_exn : string -> [ `Read | `Write | `Exec | `Exists ] list -> unit Async_unix.Import.Deferred.t
val set_close_on_exec : Fd.t -> unit
val clear_close_on_exec : Fd.t -> unit
val mkdir : ?p:unit -> ?perm:file_perm -> string -> unit Async_unix.Import.Deferred.t
val rmdir : string -> unit Async_unix.Import.Deferred.t
val chdir : string -> unit Async_unix.Import.Deferred.t
val getcwd : unit -> string Async_unix.Import.Deferred.t
val chroot : string -> unit Async_unix.Import.Deferred.t
type dir_handle = Core.Unix.dir_handle
val readdir_opt : dir_handle -> string option Async_unix.Import.Deferred.t

readdir_opt dir_handle returns the next directory member, or None when there are no more directory members to return.

  • deprecated [since 2016-08] use readdir_opt instead
val pipe : Core.Info.t -> ([ `Reader of Fd.t ] * [ `Writer of Fd.t ]) Async_unix.Import.Deferred.t

The info supplied to pipe is debugging information that will be included in the returned Fds.

val mkfifo : ?perm:file_perm -> string -> unit Async_unix.Import.Deferred.t

Create a named pipe with the given permissions.

val mkstemp : string -> (string * Fd.t) Async_unix.Import.Deferred.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.

val mkdtemp : string -> string Async_unix.Import.Deferred.t
val getgrouplist : string -> int -> int array Async_unix.Import.Deferred.t
type process_times = Core.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

    *)
}

Time functions.

val times : unit -> process_times
type tm = Core.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

    *)
}
val time : unit -> float
val gettimeofday : unit -> float
val gmtime : float -> tm
val localtime : float -> tm
val mktime : tm -> float * tm
val utimes : string -> access:float -> modif:float -> unit Async_unix.Import.Deferred.t
type env = Core.Unix.env
include sig ... end
val env_of_sexp : Sexplib.Sexp.t -> env
val sexp_of_env : env -> Sexplib.Sexp.t
val environment : unit -> string array
val getenv : string -> string option
val getenv_exn : string -> string
val putenv : key:string -> data:string -> unit
val unsetenv : string -> unit
val fork_exec : prog:string -> argv:string list -> ?use_path:bool -> ?env:[ env | `Replace_raw of string list ] -> unit -> Core.Pid.t Async_unix.Import.Deferred.t

fork_exec ~prog ~argv ?path ?env forks and execs prog with argv, and returns the child pid. If use_path = true (the default) and prog doesn't contain a slash, then fork_exec searches the PATH environment variable for prog. If env is supplied, it specifies the environment when prog is executed.

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. See Unix.exec.

type wait_on = [
  1. | `Any
  2. | `Group of Core.Pid.t
  3. | `My_group
  4. | `Pid of Core.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_nohang : wait_on -> (Core.Pid.t * Exit_or_signal.t) option
val wait_nohang_untraced : wait_on -> (Core.Pid.t * Exit_or_signal_or_stop.t) option

waitpid pid returns a deferred that becomes determined with the child's exit status, when the child process with process id pid exits. waitpid_exn is like waitpid, except the result only becomes determined if the child exits with status zero; it raises if the child terminates in any other way.

val waitpid_exn : Core.Pid.t -> unit Async_unix.Import.Deferred.t
module Inet_addr : sig ... end
module Cidr : module type of Core.Unix.Cidr
module Protocol_family : sig ... end
val socketpair : unit -> Fd.t * Fd.t
module Socket : sig ... end
val bind_to_interface_exn : (Fd.t -> [ `Any | `Interface_name of string ] -> unit) Core.Or_error.t
module Host : sig ... end
type socket_domain = Core.Unix.socket_domain =
  1. | PF_UNIX
  2. | PF_INET
  3. | PF_INET6
include sig ... end
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_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_shape_socket_domain : Core.Bin_prot.Shape.t
val socket_domain_of_sexp : Sexplib.Sexp.t -> socket_domain
val sexp_of_socket_domain : socket_domain -> Sexplib.Sexp.t
type socket_type = Core.Unix.socket_type =
  1. | SOCK_STREAM
  2. | SOCK_DGRAM
  3. | SOCK_RAW
  4. | SOCK_SEQPACKET
include sig ... end
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_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_shape_socket_type : Core.Bin_prot.Shape.t
val socket_type_of_sexp : Sexplib.Sexp.t -> socket_type
val sexp_of_socket_type : socket_type -> Sexplib.Sexp.t
type sockaddr = Core.Unix.sockaddr =
  1. | ADDR_UNIX of string
  2. | ADDR_INET of Inet_addr.t * int
include sig ... end
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_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_shape_sockaddr : Core.Bin_prot.Shape.t
val sexp_of_sockaddr : sockaddr -> Sexplib.Sexp.t
val sockaddr_of_sexp : Core.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_sockaddr_blocking_sexp : sockaddr_blocking_sexp Core.Bin_prot.Type_class.t
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_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_shape_sockaddr_blocking_sexp : Core.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
module Addr_info : sig ... end
module Name_info : sig ... end
val gethostname : unit -> string
val getuid : unit -> int
val geteuid : unit -> int
val getgid : unit -> int
val getegid : unit -> int
val setuid : int -> unit
module Error = Core.Unix.Error
type error = Core.Unix.Error.t =
  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 : Error.t -> Core.Sexp.t
  • deprecated [since 2016-10] use [Unix.Error.t] instead
val error_of_sexp : Core.Sexp.t -> Error.t
  • deprecated [since 2016-10] use [Unix.Error.t] instead
exception Unix_error of Error.t * string * string
module Terminal_io : sig ... end
module Passwd : sig ... end

Structure of entries in the passwd database.

module Group : sig ... end

Structure of entries in the groups database.

module Ifaddr = Core.Unix.Ifaddr
val getifaddrs : unit -> Ifaddr.t list Async_unix.Import.Deferred.t

getifaddrs gets the information using the socket-based netlink interface, which can block, see: https://www.infradead.org/~tgr/libnl/doc/core.html.

val getlogin : unit -> string Async_unix.Import.Deferred.t

Return the login name of the user executing the process.

This returns a deferred because the username may need to be looked up in what is essentially a database elsewhere on the network (winbound user, or NIS).

val wordexp : (?flags:[ `No_cmd | `Show_err | `Undef ] list -> string -> string array Async_unix.Import.Deferred.t) Core.Or_error.t
OCaml

Innovation. Community. Security.