diff --git a/reference/csignal.md b/reference/csignal.md index e62085edb9..da961487ef 100644 --- a/reference/csignal.md +++ b/reference/csignal.md @@ -16,9 +16,9 @@ | 名前 | 説明 | 対応バージョン | |------|------|----------------| -| `SIG_DFL` | デフォルト動作を指定する | | | -| `SIG_ERR` | `signal`関数が失敗したことを示す戻り値 | | -| `SIG_IGN` | シグナルを無視する | | +| [`SIG_DFL`](csignal/sig_dfl.md) | デフォルト動作を指定する | | +| [`SIG_ERR`](csignal/sig_err.md) | `signal`関数が失敗したことを示す戻り値 | | +| [`SIG_IGN`](csignal/sig_ign.md) | シグナルを無視する | | ### シグナル番号を表すマクロ diff --git a/reference/csignal/sig_dfl.md b/reference/csignal/sig_dfl.md new file mode 100644 index 0000000000..dce1c15dfe --- /dev/null +++ b/reference/csignal/sig_dfl.md @@ -0,0 +1,56 @@ +# SIG_DFL +* csignal[meta header] +* macro[meta id-type] + +```cpp +#define SIG_DFL see below +``` + +## 概要 +`signal`関数に渡される引数として、シグナルハンドラをデフォルトに設定するマクロ。 + +シグナル受信時に`signal`関数で`SIG_DFL`が指定されている場合、そのシグナルに対する実装定義のデフォルト処理が実行される。 + +## 例 +```cpp example +#include +#include +#include +#include + +volatile std::sig_atomic_t flag = 0; + +void handler(int) +{ + flag = 1; +} + +int main() +{ + std::signal(SIGINT, handler); + + std::cout << "Press Ctrl+C (handled)" << std::endl; + while (!flag) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + + // デフォルトに戻す + std::signal(SIGINT, SIG_DFL); + std::cout << "Press Ctrl+C again (default action)" << std::endl; + for (;;) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } +} +``` +* SIG_DFL[color ff0000] +* std::signal[link /reference/csignal/signal.md] + +### 出力 + +``` +Press Ctrl+C (handled) +Press Ctrl+C again (default action) +``` + +## 関連項目 +- [`signal`](/reference/csignal/signal.md) diff --git a/reference/csignal/sig_err.md b/reference/csignal/sig_err.md new file mode 100644 index 0000000000..49f17b00c7 --- /dev/null +++ b/reference/csignal/sig_err.md @@ -0,0 +1,51 @@ +# SIG_ERR +* csignal[meta header] +* macro[meta id-type] + +```cpp +#define SIG_ERR see below +``` + +## 概要 +`signal`関数の戻り値で、シグナルハンドラの設定に失敗したことを示す値。 + +`signal`関数が失敗した場合、この値が返される。 + +## 例 +```cpp example +#include +#include +#include +#include + +volatile std::sig_atomic_t flag = 0; + +void signal_handler(int sig) +{ + flag = 1; +} + +int main() +{ + if (std::signal(SIGINT, signal_handler) == SIG_ERR) { + std::cerr << "Failed to set signal handler" << std::endl; + return 1; + } + std::cout << "Signal handler set successfully" << std::endl; + while (!flag) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + return 0; +} +``` +* SIG_ERR[color ff0000] +* std::signal[link /reference/csignal/signal.md] + +### 出力例 + +``` +Signal handler set successfully +``` + +## 関連項目 +- [`signal`](/reference/csignal/signal.md) diff --git a/reference/csignal/sig_ign.md b/reference/csignal/sig_ign.md new file mode 100644 index 0000000000..9d2d5e112c --- /dev/null +++ b/reference/csignal/sig_ign.md @@ -0,0 +1,43 @@ +# SIG_IGN +* csignal[meta header] +* macro[meta id-type] + +```cpp +#define SIG_IGN see below +``` + +## 概要 +`signal`関数に渡される引数として、指定されたシグナルを無視させるマクロ。 + +シグナル受信時に`signal`関数で`SIG_IGN`が指定されている場合、そのシグナルは無視される。 + +## 例 +```cpp example +#include +#include +#include +#include + +int main() +{ + std::signal(SIGINT, SIG_IGN); + // Ctrl+Cを押してもプログラムは続行する + for (int i = 0; i < 10; ++i) { + std::cout << i << " " << std::flush; + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + std::cout << std::endl; + return 0; +} +``` +* SIG_IGN[color ff0000] +* std::signal[link /reference/csignal/signal.md] + +### 出力 + +``` +0 1 2 3 4 5 6 7 8 9 +``` + +## 関連項目 +- [`signal`](/reference/csignal/signal.md)