Files
2025-10-25 03:02:53 +03:00

108 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[support.signal]
# 17 Language support library [[support]](./#support)
## 17.14 Other runtime support [[support.runtime]](support.runtime#support.signal)
### 17.14.5 Signal handlers [support.signal]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L6491)
A call to the function signal synchronizes with any resulting
invocation of the signal handler so installed[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L6495)
A [*plain lock-free atomic operation*](#def:plain_lock-free_atomic_operation "17.14.5Signal handlers[support.signal]") is
an invocation of a function f from [[atomics]](atomics "32.5Atomic operations"),
such that:
- [(2.1)](#2.1)
f is the function atomic_is_lock_free(), or
- [(2.2)](#2.2)
f is the member function is_lock_free(), or
- [(2.3)](#2.3)
f is a non-static member function of class atomic_flag, or
- [(2.4)](#2.4)
f is a non-member function, and
the first parameter of f has type cv atomic_flag*, or
- [(2.5)](#2.5)
f is a non-static member function invoked on an object A,
such that A.is_lock_free() yields true, or
- [(2.6)](#2.6)
f is a non-member function, and
for every pointer-to-atomic argument A passed to f,atomic_is_lock_free(A) yields true[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L6523)
An evaluation is [*signal-safe*](#def:evaluation,signal-safe "17.14.5Signal handlers[support.signal]") unless it includes one of the following:
- [(3.1)](#3.1)
a call to any standard library function,
except for plain lock-free atomic operations and
functions explicitly identified as signal-safe;
[*Note [1](#note-1)*:
This implicitly excludes the use of new and delete expressions
that rely on a library-provided memory allocator[.](#3.1.sentence-1)
— *end note*]
- [(3.2)](#3.2)
an access to an object with thread storage duration;
- [(3.3)](#3.3)
a dynamic_cast expression;
- [(3.4)](#3.4)
throwing of an exception;
- [(3.5)](#3.5)
control entering a [*try-block*](except.pre#nt:try-block "14.1Preamble[except.pre]") or [*function-try-block*](except.pre#nt:function-try-block "14.1Preamble[except.pre]");
- [(3.6)](#3.6)
initialization of a variable with static storage duration
requiring dynamic initialization ([[basic.start.dynamic]](basic.start.dynamic "6.10.3.3Dynamic initialization of non-block variables"), [[stmt.dcl]](stmt.dcl "8.10Declaration statement"))[191](#footnote-191 "Such initialization can occur because it is the first odr-use ([term.odr.use]) of that variable.") ; or
- [(3.7)](#3.7)
waiting for the completion of the initialization of a variable with static storage duration ([[stmt.dcl]](stmt.dcl "8.10Declaration statement"))[.](#3.sentence-1)
A signal handler invocation has undefined behavior if it includes
an evaluation that is not signal-safe[.](#3.sentence-2)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L6563)
The function signal is signal-safe if it is invoked
with the first argument equal to the signal number
corresponding to the signal that caused the invocation of the handler[.](#4.sentence-1)
See also: ISO/IEC 9899:2024, 7.14
[191)](#footnote-191)[191)](#footnoteref-191)
Such initialization can occur because it is the first odr-use ([[basic.def.odr]](basic.def.odr#term.odr.use "6.3One-definition rule")) of that variable[.](#footnote-191.sentence-1)