package async_unix

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

Signal handling.

To discourage use of the Signal.Expert module, we hide it here. People can use Core.Signal.Expert if they need.

include module type of Core.Signal with type t = Core.Signal.t with module Expert := Core.Signal.Expert
type t = Core.Signal.t
include Bin_prot.Binable.S with type t := t
include Bin_prot.Binable.S_only_functions with type t := t
val bin_size_t : t Bin_prot.Size.sizer
val bin_write_t : t Bin_prot.Write.writer
val bin_read_t : t Bin_prot.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot.Read.reader

This function only needs implementation if t exposed to be a polymorphic variant. Despite what the type reads, this does *not* produce a function after reading; instead it takes the constructor tag (int) before reading and reads the rest of the variant t afterwards.

val bin_shape_t : Bin_prot.Shape.t
val bin_writer_t : t Bin_prot.Type_class.writer
val bin_reader_t : t Bin_prot.Type_class.reader
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Core.Comparable.S with type t := t
include Base.Comparable.S with type t := t
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
type comparator_witness = Core.Signal.comparator_witness
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core.Maybe_bound.t -> t Validate.check
val validate_bound : min:t Core.Maybe_bound.t -> max:t Core.Maybe_bound.t -> t Validate.check
module Replace_polymorphic_compare = Core.Signal.Replace_polymorphic_compare
module Map = Core.Signal.Map
module Set = Core.Signal.Set
include Core.Hashable.S with type t := t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
val hashable : t Core__.Hashtbl.Hashable.t
module Table = Core.Signal.Table
module Hash_set = Core.Signal.Hash_set
module Hash_queue = Core.Signal.Hash_queue
val of_string : string -> t
val equal : t -> t -> Base.Bool.t
val of_caml_int : Base.Int.t -> t

of_caml_int constructs a Signal.t given an OCaml internal signal number. This is only for the use of the Core_unix module.

val to_caml_int : t -> Base.Int.t
val to_string : t -> Base.String.t

to_string t returns a human-readable name: "sigabrt", "sigalrm", ...

type sys_behavior = [
  1. | `Continue
    (*

    Continue the process if it is currently stopped

    *)
  2. | `Dump_core
    (*

    Terminate the process and dump core

    *)
  3. | `Ignore
    (*

    Ignore the signal

    *)
  4. | `Stop
    (*

    Stop (suspend) the process

    *)
  5. | `Terminate
    (*

    Terminate the process

    *)
]

The behaviour of the system if a signal is received by a process. See include/linux/kernel.h in the Linux kernel source tree (not the file /usr/include/linux/kernel.h).

val sexp_of_sys_behavior : sys_behavior -> Sexplib0.Sexp.t
val sys_behavior_of_sexp : Sexplib0.Sexp.t -> sys_behavior
val __sys_behavior_of_sexp__ : Sexplib0.Sexp.t -> sys_behavior
val default_sys_behavior : t -> sys_behavior

Queries the default system behavior for a signal.

Specific signals, along with their default behavior and meaning.

val abrt : t

Dump_core Abnormal termination

val alrm : t

Terminate Timeout

val bus : t

Dump_core Bus error

val chld : t

Ignore Child process terminated

val cont : t

Continue Continue

val fpe : t

Dump_core Arithmetic exception

val hup : t

Terminate Hangup on controlling terminal

val ill : t

Dump_core Invalid hardware instruction

val int : t

Terminate Interactive interrupt (ctrl-C)

val kill : t

Terminate Termination (cannot be ignored)

val pipe : t

Terminate Broken pipe

val poll : t

Terminate Pollable event

val prof : t

Terminate Profiling interrupt

val quit : t

Dump_core Interactive termination

val segv : t

Dump_core Invalid memory reference

val sys : t

Dump_core Bad argument to routine

val stop : t

Stop Stop

val term : t

Terminate Termination

val trap : t

Dump_core Trace/breakpoint trap

val tstp : t

Stop Interactive stop

val ttin : t

Stop Terminal read from background process

val ttou : t

Stop Terminal write from background process

val urg : t

Ignore Urgent condition on socket

val usr1 : t

Terminate Application-defined signal 1

val usr2 : t

Terminate Application-defined signal 2

val vtalrm : t

Terminate Timeout in virtual time

val xcpu : t

Dump_core Timeout in cpu time

val xfsz : t

Dump_core File size limit exceeded

val zero : t

Ignore No-op; can be used to test whether the target process exists and the current process has permission to signal it

type pid_spec = [
  1. | `Use_Signal_unix
]
  • deprecated [since 2021-04] Use [Signal_unix]
type sigprocmask_command = [
  1. | `Use_Signal_unix
]
  • deprecated [since 2021-04] Use [Signal_unix]
val can_send_to : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val of_system_int : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val send : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val send_exn : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val send_i : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val sexp_of_pid_spec : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val sigpending : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val sigprocmask : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val sigsuspend : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
val to_system_int : [ `Use_Signal_unix ]
  • deprecated [since 2021-04] Use [Signal_unix]
module Stable = Core.Signal.Stable
val handle_default : [ `Do_not_use_with_async ] -> _

We override values from Core.Signal that we don't want people to use with Async.

val ignore : [ `Do_not_use_with_async ] -> _
val handle : ?stop:unit Async_kernel.Deferred.t -> t list -> f:(t -> unit) -> unit

handle ?stop signals ~f arranges so that whenever a signal in signals is delivered, f is called on that signal. If f raises, then an exception will be raised to the monitor in effect when handle was called.

Multiple calls to handle with the same signal will cause all the handlers to run when that signal is delivered, not just the last handler from the last call to handle.

The first time handle is called for a signal, it will install a C signal handler for it, replacing the existing C signal handler for that signal.

If stop is passed, the Async signal handler will be uninstalled when stop resolves. (the OCaml and C signal handlers are never uninstalled, so if this is the last Async signal handler then the signal will start being ignored)

val manage_by_async : t list -> unit

manage_by_async signal arranges so that signal starts being managed by Async, i.e. we install an OCaml signal handler for it. The behavior of that handler approximates the default signal behavior with the difference that for signals whose default behavior is to terminate the program, we run on-shutdown handlers first.

For terminating signals the exit status of the program will be indistinguishable from the signal not being handled. (see Shutdown.shutdown_with_signal_exn)

If handle is called (before or after), that takes precedence: the shutdown on signal behavior is suppressed (even if the corresponding stop ivar is determined).

val terminating : t list

terminating is a list of signals that can be supplied to handle and whose default behavior is to terminate the program: alrm hup int term usr1 usr2.

Various signals whose default_sys_behavior is `Terminate are not included:

       | kill   | it's not allowed to be handled                            |
       | pipe   | Async already ignores this signal, since it handles EPIPE |
       | prof   | so that we can profile things with -p                     |
       | vtalrm | it already has a handler                                  |
val is_managed_by_async : t -> bool

is_managed_by_async signal returns true iff signal is being managed by Async, and hence its default behavior is no longer in effect.

OCaml

Innovation. Community. Security.