# enum Process::ExitReason

##
Overview

The reason why a process terminated.

This enum provides a platform-independent way to query any exceptions that occurred upon a process's termination, via `Process::Status#exit_reason`.

##
Defined in:

process/status.cr

##
Enum Members

Normal = `0`

  The process exited normally.

  - On Unix-like systems, this implies `Process::Status#normal_exit?` is true.
  - On Windows, only exit statuses less than `0x40000000` are assumed to be reserved for normal exits.
Aborted = `1`

  The process terminated due to an abort request.

  - On Unix-like systems, this corresponds to `Signal::ABRT`, `Signal::KILL`, and `Signal::QUIT`.
  - On Windows, this corresponds to the `NTSTATUS` value `STATUS_FATAL_APP_EXIT`.
Interrupted = `2`

  The process exited due to an interrupt request.

  - On Unix-like systems, this corresponds to `Signal::INT`.
  - On Windows, this corresponds to the `Ctrl` + `C` and `Ctrl` + `Break` signals for console applications.
Breakpoint = `3`

  The process reached a debugger breakpoint, but no debugger was attached.

  - On Unix-like systems, this corresponds to `Signal::TRAP`.
  - On Windows, this corresponds to the `NTSTATUS` value `STATUS_BREAKPOINT`.
AccessViolation = `4`

  The process tried to access a memory address where a read or write was not allowed.

  - On Unix-like systems, this corresponds to `Signal::SEGV`.
  - On Windows, this corresponds to the `NTSTATUS` values `STATUS_ACCESS_VIOLATION` and `STATUS_STACK_OVERFLOW`.
BadMemoryAccess = `5`

  The process tried to access an invalid memory address.

  - On Unix-like systems, this corresponds to `Signal::BUS`.
  - On Windows, this corresponds to the `NTSTATUS` value `STATUS_DATATYPE_MISALIGNMENT`.
BadInstruction = `6`

  The process tried to execute an invalid instruction.

  - On Unix-like systems, this corresponds to `Signal::ILL`.
  - On Windows, this corresponds to the `NTSTATUS` values `STATUS_ILLEGAL_INSTRUCTION` and `STATUS_PRIVILEGED_INSTRUCTION`.
FloatException = `7`

  A hardware floating-point exception occurred.

  - On Unix-like systems, this corresponds to `Signal::FPE`.
  - On Windows, this corresponds to the `NTSTATUS` values `STATUS_FLOAT_DIVIDE_BY_ZERO`, `STATUS_FLOAT_INEXACT_RESULT`, `STATUS_FLOAT_INVALID_OPERATION`, `STATUS_FLOAT_OVERFLOW`, and `STATUS_FLOAT_UNDERFLOW`.
Signal = `8`

  The process exited due to a POSIX signal.

  Only applies to signals without a more specific exit reason. Unused on Windows.

Unknown = `9`

  The process exited in a way that cannot be represented by any other `ExitReason`s.

  A `Process::Status` that maps to `Unknown` may map to a different value if new enum members are added to `ExitReason`.

TerminalDisconnected = `10`

  The process exited due to the user closing the terminal window or ending an ssh session.

  - On Unix-like systems, this corresponds to `Signal::HUP`.
  - On Windows, this corresponds to the `CTRL_CLOSE_EVENT` message.
SessionEnded = `11`

  The process exited due to the user logging off or shutting down the OS.

  - On Unix-like systems, this corresponds to `Signal::TERM`.
  - On Windows, this corresponds to the `CTRL_LOGOFF_EVENT` and `CTRL_SHUTDOWN_EVENT` messages.

##
Instance Method Summary

- #abnormal? : Bool

  Returns `true` if the process exited abnormally.

- #aborted?

  Returns `true` if this enum value equals `Aborted`

- #access_violation?

  Returns `true` if this enum value equals `AccessViolation`

- #bad_instruction?

  Returns `true` if this enum value equals `BadInstruction`

- #bad_memory_access?

  Returns `true` if this enum value equals `BadMemoryAccess`

- #breakpoint?

  Returns `true` if this enum value equals `Breakpoint`

- #description : String

  Returns a textual description of this exit reason.

- #float_exception?

  Returns `true` if this enum value equals `FloatException`

- #interrupted?

  Returns `true` if this enum value equals `Interrupted`

- #normal?

  Returns `true` if this enum value equals `Normal`

- #session_ended?

  Returns `true` if this enum value equals `SessionEnded`

- #signal?

  Returns `true` if this enum value equals `Signal`

- #terminal_disconnected?

  Returns `true` if this enum value equals `TerminalDisconnected`

- #unknown?

  Returns `true` if this enum value equals `Unknown`

### Instance methods inherited from struct `Enum`

&(other : self) : self &, +(other : Int) : self +, -(other : Int) : self -, <=>(other : self) <=>, ==(other : self)
==(other) ==, ^(other : self) : self ^, |(other : self) : self |, ~ : self ~, clone clone, each(& : self -> ) each, hash(hasher) hash, includes?(other : self) : Bool includes?, inspect(io : IO) : Nil inspect, to_f32 : Float32 to_f32, to_f32! : Float32 to_f32!, to_f64 : Float64 to_f64, to_f64! : Float64 to_f64!, to_i : Int32 to_i, to_i128 : Int128 to_i128, to_i128! : Int128 to_i128!, to_i16 : Int16 to_i16, to_i16! : Int16 to_i16!, to_i32 : Int32 to_i32, to_i32! : Int32 to_i32!, to_i64 : Int64 to_i64, to_i64! : Int64 to_i64!, to_i8 : Int8 to_i8, to_i8! : Int8 to_i8!, to_json(json : JSON::Builder) : Nil to_json, to_s(io : IO) : Nil
to_s : String to_s, to_u128 : UInt128 to_u128, to_u128! : UInt128 to_u128!, to_u16 : UInt16 to_u16, to_u16! : UInt16 to_u16!, to_u32 : UInt32 to_u32, to_u32! : UInt32 to_u32!, to_u64 : UInt64 to_u64, to_u64! : UInt64 to_u64!, to_u8 : UInt8 to_u8, to_u8! : UInt8 to_u8!, to_yaml(yaml : YAML::Nodes::Builder) to_yaml, value : Int value

### Constructor methods inherited from struct `Enum`

from_value(value : Int) : self from_value, new(ctx : YAML::ParseContext, node : YAML::Nodes::Node)
new(value : self)
new(pull : JSON::PullParser) : self new, parse(string : String) : self parse

### Class methods inherited from struct `Enum`

each(& : self -> ) each, from_value?(value : Int) : self | Nil from_value?, names : Array(String) names, parse?(string : String) : self | Nil parse?, valid?(value : self) : Bool valid?, values : Array(self) values

### Macros inherited from struct `Enum`

[](*values) [], flags(*values) flags

### Instance methods inherited from module `Comparable(Enum)`

<(other : T) : Bool <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)
clamp(range : Range) clamp

### Instance methods inherited from struct `Value`

==(other : Log::Metadata::Value)
==(other : JSON::Any)
==(other : YAML::Any)
==(other) ==, dup dup

### Instance methods inherited from class `Object`

! : Bool !, !=(other) !=, !~(other) !~, ==(other) ==, ===(other : JSON::Any)
===(other : YAML::Any)
===(other) ===, =~(other) =~, as(type : Class) as, as?(type : Class) as?, class class, dup dup, hash(hasher)
hash hash, in?(collection : Object) : Bool
in?(*values : Object) : Bool in?, inspect(io : IO) : Nil
inspect : String inspect, is_a?(type : Class) : Bool is_a?, itself itself, nil? : Bool nil?, not_nil!(message)
not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, responds_to?(name : Symbol) : Bool responds_to?, tap(&) tap, to_json(io : IO) : Nil
to_json : String to_json, to_pretty_json(indent : String = " ") : String
to_pretty_json(io : IO, indent : String = " ") : Nil to_pretty_json, to_s(io : IO) : Nil
to_s : String to_s, to_yaml(io : IO) : Nil
to_yaml : String to_yaml, try(&) try, unsafe_as(type : T.class) forall T unsafe_as

### Class methods inherited from class `Object`

from_json(string_or_io : String | IO, root : String)
from_json(string_or_io : String | IO) from_json, from_yaml(string_or_io : String | IO) from_yaml

### Macros inherited from class `Object`

class_getter(*names, &block) class_getter, class_getter!(*names) class_getter!, class_getter?(*names, &block) class_getter?, class_property(*names, &block) class_property, class_property!(*names) class_property!, class_property?(*names, &block) class_property?, class_setter(*names) class_setter, def_clone def_clone, def_equals(*fields) def_equals, def_equals_and_hash(*fields) def_equals_and_hash, def_hash(*fields) def_hash, delegate(*methods, to object) delegate, forward_missing_to(delegate) forward_missing_to, getter(*names, &block) getter, getter!(*names) getter!, getter?(*names, &block) getter?, property(*names, &block) property, property!(*names) property!, property?(*names, &block) property?, setter(*names) setter

##
Instance Method Detail

def abnormal? : Bool #

Returns `true` if the process exited abnormally.

This includes all values except `Normal`.

def aborted? #

Returns `true` if this enum value equals `Aborted`

def access_violation? #

Returns `true` if this enum value equals `AccessViolation`

def bad_instruction? #

Returns `true` if this enum value equals `BadInstruction`

def bad_memory_access? #

Returns `true` if this enum value equals `BadMemoryAccess`

def breakpoint? #

Returns `true` if this enum value equals `Breakpoint`

def description : String #

Returns a textual description of this exit reason.

    Process::ExitReason::Normal.description  # => "Process exited normally"
    Process::ExitReason::Aborted.description # => "Process terminated abnormally"

`Status#description` provides more detail for a specific process status.

def float_exception? #

Returns `true` if this enum value equals `FloatException`

def interrupted? #

Returns `true` if this enum value equals `Interrupted`

def normal? #

Returns `true` if this enum value equals `Normal`

def session_ended? #

Returns `true` if this enum value equals `SessionEnded`

def signal? #

Returns `true` if this enum value equals `Signal`

def terminal_disconnected? #

Returns `true` if this enum value equals `TerminalDisconnected`

def unknown? #

Returns `true` if this enum value equals `Unknown`