Skip to content

Commit 86baed4

Browse files
authored
Merge pull request #1578 from cpprefjp/feat/csigna
csignalライブラリページの追加
2 parents b54fd0f + af07750 commit 86baed4

File tree

12 files changed

+452
-4
lines changed

12 files changed

+452
-4
lines changed

reference.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@
230230
| [`<clocale>`](/reference/clocale.md) | ロケール | |
231231
| [`<cmath>`](/reference/cmath.md) | 数学関数 | |
232232
| `<csetjmp>` | ジャンプ処理 | |
233-
| `<csignal>` | シグナル | |
233+
| [`<csignal>`](reference/csignal.md) | シグナル | |
234234
| `<cstdalign>` | アライメント操作のマクロ | C++17で非推奨<br/> C++20で削除 |
235235
| `<cstdarg>` | 可変引数操作 | |
236236
| [`<stdbit.h>`](/reference/stdbit.h.md.nolink) | ビット操作 | C++26 |

reference/csignal.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# csignal
2+
* csignal[meta header]
3+
4+
`<csignal>`ヘッダでは、シグナル操作のための機能を定義する。
5+
シグナルの集合、意味、及びデフォルトの処理は処理系定義である。
6+
7+
##
8+
9+
| 名前 | 説明 | 対応バージョン |
10+
|------|------|----------------|
11+
| [`sig_atomic_t`](csignal/sig_atomic_t.md) | 非同期シグナルハンドラからアトミックなエンティティとしてアクセス可能な整数型 | |
12+
13+
## マクロ
14+
15+
### `signal`関数用のハンドラ指定子
16+
17+
| 名前 | 説明 | 対応バージョン |
18+
|------|------|----------------|
19+
| `SIG_DFL` | デフォルト動作を指定する | | |
20+
| `SIG_ERR` | `signal`関数が失敗したことを示す戻り値 | |
21+
| `SIG_IGN` | シグナルを無視する | |
22+
23+
### シグナル番号を表すマクロ
24+
25+
| 名前 | 説明 | 対応バージョン |
26+
|------|------|----------------|
27+
| [`SIGINT`](csignal/sigint.md) | 割り込みを示すシグナル番号 | |
28+
| [`SIGILL`](csignal/sigill.md) | 不正な命令を示すシグナル番号 | |
29+
| [`SIGABRT`](csignal/sigabrt.md) | `abort`関数などによる異常終了を示すシグナル番号 | |
30+
| [`SIGFPE`](csignal/sigfpe.md) | 算術演算エラーを示すシグナル番号 | |
31+
| [`SIGSEGV`](csignal/sigsegv.md) | 無効なメモリアクセスを示すシグナル番号 | |
32+
| [`SIGTERM`](csignal/sigterm.md) | 終了要求を示すシグナル番号 | |
33+
34+
## 関数
35+
36+
| 名前 | 説明 | 対応バージョン |
37+
|------|------|----------------|
38+
| [`signal`](csignal/signal.md) | 特定のシグナルに対するシグナルハンドラを設定する | |
39+
| [`raise`](csignal/raise.md) | プログラムにシグナルを送信する | |

reference/csignal/raise.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# raise
2+
* csignal[meta header]
3+
* std[meta namespace]
4+
* function[meta id-type]
5+
6+
```cpp
7+
namespace std {
8+
int raise(int sig);
9+
}
10+
```
11+
12+
## 概要
13+
現在のプログラムにシグナルを送信する。
14+
15+
## 引数
16+
- `sig`: 送信するシグナル番号
17+
18+
## 戻り値
19+
正常に終了した場合は0を返す。
20+
それ以外の場合は非ゼロの値を返す。
21+
22+
## 備考
23+
`signal`関数などにより、シグナルハンドラが呼び出された場合、それが終了するまでこの関数は戻らない。
24+
25+
## 例
26+
```cpp example
27+
#include <iostream>
28+
#include <csignal>
29+
30+
volatile std::sig_atomic_t got_signal = 0;
31+
32+
void signal_handler(int signum) {
33+
got_signal = 1;
34+
}
35+
36+
int main (){
37+
std::signal(SIGABRT, signal_handler);
38+
std::raise(SIGABRT);
39+
if (got_signal)
40+
std::cout << "SIGABRT" << std::endl;
41+
return 0;
42+
}
43+
```
44+
* std::raise[color ff0000]
45+
46+
### 出力例
47+
```
48+
SIGABRT
49+
```

reference/csignal/sig_atomic_t.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# sig_atomic_t
2+
* csignal[meta header]
3+
* std[meta namespace]
4+
* type-alias[meta id-type]
5+
6+
```cpp
7+
namespace std {
8+
using sig_atomic_t = integer-type;
9+
}
10+
```
11+
* integer-type[italic]
12+
13+
## 概要
14+
`sig_atomic_t`は、非同期シグナルハンドラと通常の実行コンテキストの間で、単純な読み書きを分断されずに行えることが保証された整数型である。
15+
16+
この型に対して保証されるのは単純な代入および読み出しのみであり、
17+
複合操作や算術演算は保証されない。
18+
19+
実際の使用では通常`volatile`修飾子と組み合わせて用いられる。
20+
21+
具体的な型は処理系定義である。
22+
23+
## 備考
24+
最大値は`SIG_ATOMIC_MAX`、最小値は`SIG_ATOMIC_MIN`に定義されている。
25+
26+
## 例
27+
```cpp example
28+
#include <csignal>
29+
#include <iostream>
30+
31+
volatile std::sig_atomic_t flag = 0;
32+
33+
void signal_handler(int signum)
34+
{
35+
flag = 1;
36+
}
37+
38+
int main ()
39+
{
40+
std::signal(SIGINT, signal_handler);
41+
while (!flag) {
42+
//処理
43+
}
44+
if (flag) {
45+
std::cout << "caught SIGINT" << std::endl;
46+
}
47+
return 0;
48+
}
49+
```
50+
* std::sig_atomic_t[color ff0000]
51+
52+
### 出力例
53+
```
54+
caught SIGINT
55+
```
56+
`Ctrl + c`などで割り込みが発生した場合。
57+
58+
## 関連項目
59+
- [`SIG_ATOMIC_MAX`](/reference/cstdint/sig_atomic_max.md)
60+
- [`SIG_ATOMIC_MIN`](/reference/cstdint/sig_atomic_min.md)

reference/csignal/sigabrt.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# SIGABRT
2+
* csignal[meta header]
3+
* macro[meta id-type]
4+
5+
```cpp
6+
#define SIGABRT see below
7+
```
8+
9+
## 概要
10+
`abort`関数などによる異常終了時に送られるシグナルの、シグナル番号を表すマクロ。
11+
12+
`int`型の正の整数の定数式に展開され、実際の値は未規定。
13+
14+
## 例
15+
```cpp example
16+
#include <csignal>
17+
#include <cstdlib>
18+
19+
void handler(int) {
20+
std::_Exit(0);
21+
}
22+
23+
int main() {
24+
std::signal(SIGABRT, handler);
25+
std::abort();
26+
}
27+
```
28+
* SIGABRT[color ff0000]
29+
30+
### 出力
31+
```
32+
```
33+
34+
## 関連項目
35+
- [`abort`](/reference/cstdlib/abort.md)

reference/csignal/sigfpe.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# SIGFPE
2+
* csignal[meta header]
3+
* macro[meta id-type]
4+
5+
```cpp
6+
#define SIGFPE see below
7+
```
8+
9+
## 概要
10+
算術演算エラー(浮動小数点例外など)が発生した際に送られるシグナルの、シグナル番号を表すマクロ。
11+
12+
`int`型の正の整数の定数式に展開され、実際の値は未規定。
13+
14+
## 例
15+
```cpp example
16+
#include <csignal>
17+
#include <cstdlib>
18+
19+
void handler(int)
20+
{
21+
std::_Exit(0);
22+
}
23+
24+
int main()
25+
{
26+
std::signal(SIGFPE, handler);
27+
28+
volatile double x = 1.0;
29+
volatile double y = 0.0;
30+
// 浮動小数点の 0 除算。
31+
// SIGFPE が発生することもあるが、規格上は保証されない。
32+
x = x / y;
33+
}
34+
```
35+
* SIGFPE[color ff0000]
36+
37+
### 出力
38+
```
39+
```

reference/csignal/sigill.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# SIGILL
2+
* csignal[meta header]
3+
* macro[meta id-type]
4+
5+
```cpp
6+
#define SIGILL see below
7+
```
8+
9+
## 概要
10+
無効な命令を実行しようとした際に送られるシグナルの、シグナル番号を表すマクロ。
11+
12+
`int`型の正の整数の定数式に展開され、実際の値は未規定。
13+
14+
## 例
15+
```cpp example
16+
#include <csignal>
17+
#include <cstdlib>
18+
19+
void handler(int)
20+
{
21+
std::_Exit(0);
22+
}
23+
24+
int main()
25+
{
26+
std::signal(SIGILL, handler);
27+
std::raise(SIGILL);
28+
}
29+
```
30+
* SIGILL[color ff0000]
31+
32+
### 出力
33+
```
34+
```

reference/csignal/sigint.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# SIGINT
2+
* csignal[meta header]
3+
* macro[meta id-type]
4+
5+
```cpp
6+
#define SIGINT see below
7+
```
8+
9+
## 概要
10+
外部割り込みが発生した際に送られるシグナルの、シグナル番号を表すマクロ。
11+
12+
`int`型の正の整数の定数式に展開され、実際の値は未規定。
13+
14+
## 例
15+
```cpp example
16+
#include <csignal>
17+
#include <cstdlib>
18+
19+
volatile std::sig_atomic_t flag = 0;
20+
21+
void handler(int)
22+
{
23+
std::_Exit(0);
24+
}
25+
26+
int main()
27+
{
28+
std::signal(SIGINT, handler);
29+
std::raise(SIGINT);
30+
return 0;
31+
}
32+
```
33+
* SIGINT[color ff0000]
34+
35+
### 出力
36+
```
37+
```

reference/csignal/signal.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# signal
2+
* csignal[meta header]
3+
* std[meta namespace]
4+
* function[meta id-type]
5+
6+
```cpp
7+
namespace std {
8+
extern "C" using signal-handler = void(int); // exposition only
9+
signal-handler* signal(int sig, signal-handler* func);
10+
}
11+
```
12+
* signal-handler[italic]
13+
14+
## 概要
15+
16+
シグナル番号`sig`の受け取り後の処理を指定する。
17+
18+
`func`の値が`SIG_DFL`の場合、そのシグナルに対するデフォルトの処理が行われる。
19+
`func`の値が`SIG_IGN`の場合、そのシグナルを無視する。
20+
それ以外の場合、関数`func`が実行される。
21+
22+
## 引数
23+
24+
- `sig`: シグナルハンドラを設定するシグナル番号
25+
- `func`: シグナルに対する処理。以下のいずれかを指定する。
26+
- `SIG_DFL`: そのシグナルに対するデフォルト処理を指定する。
27+
- `SIG_IGN`: そのシグナルを無視する。
28+
- `func`: シグナルハンドラにする関数へのポインタを示す。
29+
30+
### シグナルハンドラ関数の制約
31+
シグナルハンドラ関数は戻り値を持たず、`int`型の引数を持つ。
32+
この引数にはシグナル番号が格納される。
33+
34+
シグナルハンドラ内で以下以外の処理を行うことは未定義動作である。
35+
- `volatile std::sig_atomic_t`オブジェクトへの代入
36+
- `abort`関数
37+
- `_Exit`関数
38+
- `quick_exit`関数
39+
- `atomic`引数がロックフリーである場合の`<stdatomic.h>`内の関数
40+
- 任意の`atomic`引数を持つ`atomic_is_lock_free`関数
41+
- `signal`関数(ただし、ハンドラを起こしたシグナル番号に対する呼び出しに限る)
42+
43+
## 戻り値
44+
45+
成功した場合、指定されたシグナルに対する直前のハンドラを返す。
46+
それ以外の場合は`SIG_ERR`を返す
47+
48+
## 備考
49+
50+
マルチスレッド内でのこの関数の動作は未定義。
51+
52+
## 例
53+
```cpp example
54+
#include <csignal>
55+
#include <iostream>
56+
57+
volatile std::sig_atomic_t flag = 0;
58+
59+
void signal_handler(int sig)
60+
{
61+
flag = 1;
62+
// std::cout << "signal: " << sig << std::endl; 未定義動作
63+
}
64+
65+
int main()
66+
{
67+
std::signal(SIGINT, signal_handler);
68+
while (!flag) {
69+
//処理
70+
}
71+
if (flag) {
72+
std::cout << "caught SIGINT" << std::endl;
73+
}
74+
return 0;
75+
}
76+
```
77+
* std::signal[color ff0000]
78+
79+
### 出力例
80+
```
81+
caught SIGINT
82+
```

0 commit comments

Comments
 (0)