平安银行柜员工资待遇怎么样 2025-09-26 06:51:15
战地冲突:2025全球争霸赛——终极荣耀之战暨阵营联合对抗盛典 2025-07-10 04:23:29
大唐仙妖劫:2025年4月24日盛大开启的仙妖争霸赛 2025-04-24 07:15:27
猎魔之血:暗夜降临——全球玩家挑战赛 2025-04-09 11:36:10
美国绿卡在手,每年必须在美国多久才可以保住?最新规定详解 2025-10-11 19:03:50
《将王之王》2025年5月7日盛大开启——王者争霸赛,谁将问鼎巅峰? 2025-05-07 08:47:14
【2025 10月最新】OPPO系列手機推薦!全系列高中低價位機款全都有! 2025-10-09 00:19:54
斗兽战棋2025年五一狂欢盛典:兽王争霸赛与限定皮肤大放送 2025-05-01 15:43:28
美男和帅哥的区别,美男和帅哥那个更受欢迎? 2025-11-02 04:08:22
傲视神魔传:混沌之巅——2025年5月2日开服盛典 2025-05-02 06:32:38

std::signal

C++

Compiler support

Freestanding and hosted

Language

Standard library

Standard library headers

Named requirements

Feature test macros

(C++20)

Language support library

Concepts library

(C++20)

Diagnostics library

Memory management library

Metaprogramming library

(C++11)

General utilities library

Containers library

Iterators library

Ranges library

(C++20)

Algorithms library

Strings library

Text processing library

Numerics library

Date and time library

Input/output library

Filesystem library

(C++17)

Concurrency support library

(C++11)

Execution control library

(C++26)

Technical specifications

Symbols index

External libraries

Utilities library

Language support

Type support

(basic types, RTTI)

Library feature-test macros

(C++20)

Program utilities

Variadic functions

initializer_list

(C++11)

is_constant_evaluated

(C++20)

is_within_lifetime

(C++26)

source_location

(C++20)

Coroutine support

(C++20)

Contract support

(C++26)

Three-way comparison

three_way_comparable

three_way_comparable_with

(C++20)

(C++20)

strong_ordering

(C++20)

weak_ordering

(C++20)

partial_ordering

(C++20)

common_comparison_category

(C++20)

compare_three_way_result

(C++20)

compare_three_way

(C++20)

strong_order

(C++20)

weak_order

(C++20)

partial_order

(C++20)

compare_strong_order_fallback

(C++20)

compare_weak_order_fallback

(C++20)

compare_partial_order_fallback

(C++20)

is_eq

is_lt

is_lteq

(C++20)

(C++20)

(C++20)

is_neq

is_gt

is_gteq

(C++20)

(C++20)

(C++20)

General utilities

Function objects

Bit manipulation

(C++20)

C-style bit manipulation

(C++26)

bitset

hash

(C++11)

Relational operators

(deprecated in C++20)

rel_ops::operator!=

rel_ops::operator>

rel_ops::operator<=

rel_ops::operator>=

Integer comparison functions

cmp_equal

cmp_less

cmp_less_than

(C++20)

(C++20)

(C++20)

cmp_not_equal

cmp_greater

cmp_greater_than

(C++20)

(C++20)

(C++20)

in_range

(C++20)

Swap

and

type operations

swap

ranges::swap

(C++20)

exchange

(C++14)

declval

(C++11)

to_underlying

(C++23)

forward

(C++11)

forward_like

(C++23)

move

(C++11)

move_if_noexcept

(C++11)

as_const

(C++17)

Common vocabulary types

pair

tuple

(C++11)

optional

(C++17)

any

(C++17)

variant

(C++17)

tuple_size

(C++11)

tuple_element

(C++11)

apply

(C++17)

make_from_tuple

(C++17)

expected

(C++23)

Program support utilities

Program termination

abort

exit

quick_exit

(C++11)

_Exit

(C++11)

atexit

at_quick_exit

(C++11)

EXIT_SUCCESS

EXIT_FAILURE

Unreachable control flow

unreachable

(C++23)

Communicating with the environment

system

getenv

Signals

signal

raise

sig_atomic_t

SIG_DFL

SIG_IGN

SIG_ERR

Signal types

SIGABRT

SIGFPE

SIGILL

SIGINT

SIGSEGV

SIGTERM

Non-local jumps

setjmp

longjmp

Types

jmp_buf

定义于头文件

/* signal-handler */

*

signal

(

int

sig,

/* signal-handler */

*

handler

)

;

(1)

extern

"C"

using

/* signal-handler */

=

void

(

int

)

;

(2)

(

仅用于说明*

)

改变对信号

sig

的处理方式。根据

handler

参数的不同,可以忽略信号、设置为默认处理方式,或由用户自定义函数处理。

当信号处理函数被设置为某个函数且信号发生时,是否立即在执行信号处理函数前执行

std

::

signal

(

sig,

SIG_DFL

)

是由实现定义的。同时,实现可以阻止某些实现定义的信号集在信号处理函数运行期间发生。

对于某些信号,实现可能在程序启动时调用

std

::

signal

(

sig,

SIG_IGN

)

。对于其余信号,实现必须调用

std

::

signal

(

sig,

SIG_DFL

)

(注:POSIX 引入

sigaction

以标准化这些实现定义的行为)

目录

1

参数

2

返回值

3

信号处理器

4

备注

5

示例

6

参考

7

缺陷报告

8

另请参阅

参数

sig

-

要设置信号处理程序的信号。可以是实现定义的值或以下值之一:

SIGABRT

SIGFPE

SIGILL

SIGINT

SIGSEGV

SIGTERM

定义信号类型

(宏常量)

handler

-

信号处理程序。必须是以下之一:

SIG_DFL

宏。信号处理程序被设置为默认信号处理程序。

SIG_IGN

宏。信号被忽略。

函数指针。函数的签名必须等价于以下形式:

extern

"C"

void

fun

(

int

sig

)

;

返回值

成功时返回先前的信号处理器,失败时返回

SIG_ERR

(在某些实现中设置信号处理器可能被禁用)。

信号处理器

作为信号处理程序安装的用户自定义函数需遵循以下限制。

若信号处理器的调用并非源自

std::abort

std::raise

(异步信号),则在以下情况下行为未定义:

信号处理器调用标准库中的任何函数,除了:

std::abort

std::_Exit

std::quick_exit

std::signal

,且第一个参数为当前所处理信号的编号(异步处理器可重新注册自身,但不可注册其他信号)。

信号处理器引用任何具有静态存储期且非

std::atomic

(since C++11)

volatile

std::

sig_atomic_t

的对象。

(until C++17)

纯无锁原子操作

是指调用来自

(since C++23)

的函数

f

,且满足以下条件之一:

f

是函数

std::atomic_is_lock_free

f

是成员函数

is_lock_free

(例如

std::atomic::is_lock_free()

),

f

std::atomic_flag

的非静态成员函数,

f

是非成员函数,且

f

的第一个参数类型为

cv

std::

atomic_flag

*

f

是在对象

obj

上调用的非静态成员函数,且

obj.

is_lock_free

(

)

返回

true

,或

f

是非成员函数,且对于传递给

f

的每个指向原子类型的指针参数

arg

std::

atomic_is_lock_free

(

arg

)

返回

true

若任何信号处理器执行以下任一操作,则行为未定义:

调用任何库函数,除了纯无锁原子操作及以下

信号安全

函数(特别注意,动态分配非信号安全):

std::signal

,且第一个参数为当前所处理信号的编号(信号处理器可重新注册自身,但不可注册其他信号)。

std::numeric_limits

的成员函数

std::_Exit

std::abort

std::quick_exit

std::initializer_list

的成员函数及

std::initializer_list

的重载版本

std::begin

std::end

std::forward

std::move

std::move_if_noexcept

中的所有函数

std::memcpy

std::memmove

访问具有线程存储期的对象

dynamic_cast

表达式

throw

表达式

进入

try

执行

动态非局部初始化

的静态变量初始化(包括延迟至首次 ODR 使用)

等待由于其他线程并发初始化而导致的任何具有静态存储期变量的初始化完成

(since C++17)

如果用户定义函数在处理

SIGFPE

SIGILL

SIGSEGV

或任何其他指定计算异常的实现定义信号时返回,则行为是未定义的。

如果信号处理函数是由于

std::abort

std::raise

(同步信号)的调用而被触发,那么当信号处理函数内部调用

std::raise

时,其行为是未定义的。

进入信号处理程序时,

浮点环境

的状态及所有对象的值均未指定,除了:

类型为

volatile

std::

sig_atomic_t

的对象

无锁的

std::atomic

类型对象

通过

std::atomic_signal_fence

可见的副作用

(C++11 起)

从信号处理程序返回时,任何被信号处理程序修改且非

volatile

std::

sig_atomic_t

或非无锁

std::atomic

的对象值均不确定。

(C++14 前)

对函数

signal()

的调用与信号处理程序的任何后续调用

同步于

若信号处理程序因调用

std::raise

(同步地)而执行,则处理程序的执行

顺序后于

std::raise

的调用且

顺序先于

其返回,并与

std::raise

在同一线程运行。其他信号的处理程序执行相对于程序其余部分

无顺序关系

,并在未指定线程运行。

若对同一

volatile

std::

sig_atomic_t

类型对象的两次访问均发生在同一线程,即使一次或多次访问发生在信号处理程序中,也不会导致数据竞争。

对于每次信号处理程序调用,调用信号处理程序的线程所执行的操作可划分为 A、B 两组,使得 B 组中的操作不会

先发生于

A 组中的操作,且这些

volatile

std::

sig_atomic_t

对象的取值表现如同 A 组所有操作均

先发生于

信号处理程序执行,且信号处理程序执行

先发生于

B 组所有操作。

(C++14 起)

注释

POSIX要求

signal

具备线程安全性,并

规定了一系列异步信号安全库函数

,这些函数可以从任何信号处理程序中调用。

信号处理函数应具有

C链接

,并且通常仅使用C和C++共同子集的功能。然而,常见实现允许使用具有C++链接的函数作为信号处理程序。

示例

运行此代码

#include

#include

namespace

{

volatile std::sig_atomic_t gSignalStatus;

}

void signal_handler(int signal)

{

gSignalStatus = signal;

}

int main()

{

// 安装信号处理器

std::signal(SIGINT, signal_handler);

std::cout << "SignalValue: " << gSignalStatus << '\n';

std::cout << "Sending signal: " << SIGINT << '\n';

std::raise(SIGINT);

std::cout << "SignalValue: " << gSignalStatus << '\n';

}

可能的输出:

SignalValue: 0

Sending signal: 2

SignalValue: 2

参考文献

C++23 标准 (ISO/IEC 14882:2024):

17.13.5 信号处理程序 [support.signal]

C++20 标准 (ISO/IEC 14882:2020):

17.13.5 信号处理程序 [support.signal]

C++17 标准 (ISO/IEC 14882:2017):

21.10.4 信号处理程序 [support.signal]

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告

适用范围

发布时行为

正确行为

LWG 3756

C++17

未明确说明

std::atomic_flag

是否具有信号安全性

具有信号安全性

参阅

raise

为特定信号运行信号处理程序

(函数)

atomic_signal_fence

(C++11)

同一线程内线程与信号处理程序之间的栅栏

(函数)

C 文档

关于

signal